@codedrifters/configulator 0.0.266 → 0.0.268

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 CHANGED
@@ -1461,235 +1461,1716 @@ interface AgentFeaturesConfig {
1461
1461
  }
1462
1462
  /*******************************************************************************
1463
1463
  *
1464
- * AgentConfig Options
1464
+ * Agent Tier Config
1465
1465
  *
1466
1466
  ******************************************************************************/
1467
1467
  /**
1468
- * Options for the AgentConfig component.
1468
+ * A single consumer-supplied agent-type → funnel-tier mapping.
1469
+ *
1470
+ * The `type` field is the GitHub `type:*` label value **without** the
1471
+ * `type:` prefix (e.g. supply `"company-profile"`, not
1472
+ * `"type:company-profile"`). The `tier` field is a funnel tier in the
1473
+ * range **0–4**:
1474
+ *
1475
+ * - **0 — routing.** Unblocks other work. Picked first on a priority tie.
1476
+ * - **1 — research.** Feeds downstream pipelines.
1477
+ * - **2 — profiles.** Consumes research.
1478
+ * - **3 — synthesis.** Produces deliverables.
1479
+ * - **4 — support.** Important but not pipeline-critical.
1480
+ *
1481
+ * The `orchestrator` bundle validates this value at synth time and
1482
+ * fails the build when the tier is outside 0–4 or when `type` is
1483
+ * empty/whitespace.
1484
+ *
1485
+ * @see AgentTierConfig
1486
+ * @see ./bundles/tiers.ts#renderAgentTierSection
1469
1487
  */
1470
- interface AgentConfigOptions {
1488
+ interface AgentTierEntry {
1471
1489
  /**
1472
- * Target platforms to generate configuration for.
1473
- * @default [AGENT_PLATFORM.CURSOR, AGENT_PLATFORM.CLAUDE]
1490
+ * GitHub `type:*` label value (without the `type:` prefix).
1491
+ * @example 'research', 'company-profile', 'requirement'
1474
1492
  */
1475
- readonly platforms?: ReadonlyArray<AgentPlatform>;
1493
+ readonly type: string;
1476
1494
  /**
1477
- * Additional agent rules to generate alongside auto-detected and bundled rules.
1478
- * Custom rules override bundled rules of the same name.
1495
+ * Funnel tier 0–4. Lower tiers dispatch first when priority is tied.
1479
1496
  */
1480
- readonly rules?: ReadonlyArray<AgentRule>;
1497
+ readonly tier: 0 | 1 | 2 | 3 | 4;
1498
+ }
1499
+ /**
1500
+ * Funnel-tier configuration consumed by the `orchestrator` bundle.
1501
+ *
1502
+ * The orchestrator sorts eligible issues by
1503
+ * **priority desc → tier asc → issue number asc**. Lower tier numbers
1504
+ * win ties on priority so research work feeds downstream pipelines
1505
+ * before synthesis consumes attention.
1506
+ *
1507
+ * Every field is optional. When the whole config is absent the
1508
+ * orchestrator renders its built-in default tier table (matching the
1509
+ * openhi `DISPATCHER.md` source). Two override knobs are supported:
1510
+ *
1511
+ * - `tiers` — **replace** the default list wholesale. Rare; reserved
1512
+ * for repos that want a bespoke taxonomy end-to-end.
1513
+ * - `customTypes` — **extend** whichever list is in play. Entries
1514
+ * with a `type` that already exists in the default (or replacement)
1515
+ * list win — consumer overrides take precedence.
1516
+ *
1517
+ * @see AgentTierEntry
1518
+ * @see ./bundles/tiers.ts#resolveAgentTiers
1519
+ */
1520
+ interface AgentTierConfig {
1481
1521
  /**
1482
- * Additional skills to generate.
1522
+ * Replacement tier list. When supplied, the built-in default list
1523
+ * is discarded and this list is used as the base before
1524
+ * `customTypes` are merged in. Supply an empty array is an error —
1525
+ * omit the field to keep the defaults.
1483
1526
  */
1484
- readonly skills?: ReadonlyArray<AgentSkill>;
1527
+ readonly tiers?: ReadonlyArray<AgentTierEntry>;
1485
1528
  /**
1486
- * Custom sub-agent definitions.
1529
+ * Additional tier mappings merged on top of whatever list is in
1530
+ * play (default or replacement). Later entries override earlier
1531
+ * entries on `type` collision, so consumer-supplied mappings win
1532
+ * over the built-in defaults.
1487
1533
  */
1488
- readonly subAgents?: ReadonlyArray<AgentSubAgent>;
1534
+ readonly customTypes?: ReadonlyArray<AgentTierEntry>;
1535
+ }
1536
+ /*******************************************************************************
1537
+ *
1538
+ * Scope Gate Config
1539
+ *
1540
+ ******************************************************************************/
1541
+ /**
1542
+ * Threshold pair describing the inclusive upper bounds of the `small` /
1543
+ * `medium` scope classes. Any issue above `medium` is classified `large`
1544
+ * and rejected by the scope gate.
1545
+ *
1546
+ * Every issue is scored on two signals read from the issue body:
1547
+ *
1548
+ * - **Acceptance criteria** — the count of checkbox lines
1549
+ * (`- [ ]` / `- [x]`) under the issue's `## Acceptance Criteria`
1550
+ * section.
1551
+ * - **Sources** — the count of bullet list items under the issue's
1552
+ * `## Inputs` / `## References` / `## Sources` sections (whichever
1553
+ * exists; they're summed if multiple exist).
1554
+ *
1555
+ * `small` requires **both** counts to be at or below `smallMax`.
1556
+ * `medium` requires **both** counts to be at or below `mediumMax`.
1557
+ * Anything above `mediumMax` on either axis is `large`.
1558
+ *
1559
+ * @see ScopeGateConfig
1560
+ * @see ./bundles/scope-gate.ts#classifyIssueScope
1561
+ */
1562
+ interface ScopeGateThresholds {
1489
1563
  /**
1490
- * Custom procedure definitions (executable shell scripts).
1564
+ * Inclusive upper bound on the `acceptance-criteria` / `sources`
1565
+ * count for the **small** scope class.
1491
1566
  */
1492
- readonly procedures?: ReadonlyArray<AgentProcedure>;
1567
+ readonly smallMax: number;
1493
1568
  /**
1494
- * MCP server configurations. Cross-platform rendered to the appropriate
1495
- * config file for each platform.
1569
+ * Inclusive upper bound on the `acceptance-criteria` / `sources`
1570
+ * count for the **medium** scope class. Must be strictly greater
1571
+ * than `smallMax`.
1496
1572
  */
1497
- readonly mcpServers?: Readonly<Record<string, McpServerConfig>>;
1573
+ readonly mediumMax: number;
1574
+ }
1575
+ /**
1576
+ * Scope-gate configuration consumed by the `orchestrator` bundle.
1577
+ *
1578
+ * The scope gate rejects oversized issues at dispatch time and
1579
+ * instructs the orchestrator to decompose them into phased sub-issues
1580
+ * instead of claiming a worker session for a multi-hour task. The
1581
+ * gate reads the **issue body only** — it does not inspect the
1582
+ * repository. Heuristics are deliberately repo-agnostic so any
1583
+ * consuming repo can adopt the contract without customizing code.
1584
+ *
1585
+ * Two threshold dials control the classification:
1586
+ *
1587
+ * - `acceptanceCriteria` — counts of checkbox lines under the issue's
1588
+ * `## Acceptance Criteria` section.
1589
+ * - `sources` — counts of bullet list items under the issue's
1590
+ * `## Inputs` / `## References` / `## Sources` sections.
1591
+ *
1592
+ * An issue is classified **small** when both counts are at or below
1593
+ * the `small` thresholds, **medium** when both are at or below the
1594
+ * `medium` thresholds, and **large** otherwise. Large issues are
1595
+ * rejected — the orchestrator applies `status:needs-attention`,
1596
+ * posts a decomposition proposal comment, and (when `autoFile` is
1597
+ * true) files the proposed phased sub-issues automatically.
1598
+ *
1599
+ * Consumers may override the per-axis thresholds, the decomposition
1600
+ * comment template, and the auto-file toggle. When the whole config
1601
+ * is absent the orchestrator applies openhi's published defaults
1602
+ * (small: ≤3 AC + ≤2 sources; medium: ≤6 AC + ≤5 sources).
1603
+ *
1604
+ * Malformed configs — thresholds that are negative, non-integer, or
1605
+ * inverted (medium ≤ small) — fail the build at synth time via
1606
+ * `validateScopeGateConfig`.
1607
+ *
1608
+ * @see ScopeGateThresholds
1609
+ * @see ./bundles/scope-gate.ts#resolveScopeGate
1610
+ * @see ./bundles/scope-gate.ts#validateScopeGateConfig
1611
+ * @see ./bundles/scope-gate.ts#renderScopeGateSection
1612
+ */
1613
+ interface ScopeGateConfig {
1498
1614
  /**
1499
- * Whether to automatically detect and include context-aware rule bundles
1500
- * based on project introspection.
1501
- * @default true
1615
+ * Master switch for the scope gate. When `false`, the orchestrator
1616
+ * dispatches issues of every size and no decomposition proposal is
1617
+ * posted. Defaults to `true` — scope gating is on by default.
1502
1618
  */
1503
- readonly autoDetectBundles?: boolean;
1619
+ readonly enabled?: boolean;
1504
1620
  /**
1505
- * Explicit list of bundle names to include, regardless of auto-detection.
1506
- * @example ['vitest', 'aws-cdk']
1621
+ * Classification thresholds for **acceptance-criteria counts**
1622
+ * (checkbox lines under `## Acceptance Criteria`).
1623
+ * Defaults to `{ smallMax: 3, mediumMax: 6 }` — openhi's published
1624
+ * heuristic.
1507
1625
  */
1508
- readonly includeBundles?: ReadonlyArray<string>;
1626
+ readonly acceptanceCriteria?: ScopeGateThresholds;
1509
1627
  /**
1510
- * Bundle names to exclude even if auto-detection would include them.
1511
- * @example ['jest']
1628
+ * Classification thresholds for **source counts** (bullet list
1629
+ * items under the issue's `## Inputs` / `## References` /
1630
+ * `## Sources` sections). Defaults to `{ smallMax: 2, mediumMax: 5 }`.
1512
1631
  */
1513
- readonly excludeBundles?: ReadonlyArray<string>;
1632
+ readonly sources?: ScopeGateThresholds;
1514
1633
  /**
1515
- * Whether to include the base rule set (project-overview, general conventions).
1516
- * @default true
1634
+ * When `true`, the orchestrator files the proposed phased
1635
+ * sub-issues automatically after posting the decomposition
1636
+ * proposal comment. When `false` (the default), it posts the
1637
+ * proposal and stops — a human is expected to file the sub-issues.
1638
+ *
1639
+ * Autofile is **opt-in** because sub-issue creation permanently
1640
+ * modifies the project state; repos that adopt the feature should
1641
+ * validate the decomposition template first and graduate to
1642
+ * autofile once they trust the output.
1643
+ * @default false
1517
1644
  */
1518
- readonly includeBaseRules?: boolean;
1645
+ readonly autoFile?: boolean;
1519
1646
  /**
1520
- * Names of individual rules to exclude from any source.
1647
+ * Override for the decomposition-proposal comment body posted on
1648
+ * a rejected `large` issue. When unset, the bundle ships a generic
1649
+ * template that the orchestrator fills in with the classified axis
1650
+ * (`acceptance-criteria` / `sources`), the observed counts, and a
1651
+ * boilerplate `Phase 1 / Phase 2 / Phase 3` skeleton for the agent
1652
+ * to refine.
1653
+ *
1654
+ * The override string may embed the following placeholders — the
1655
+ * orchestrator substitutes them at comment-composition time:
1656
+ *
1657
+ * - `<AC_COUNT>` — observed acceptance-criteria count.
1658
+ * - `<SOURCES_COUNT>` — observed sources count.
1659
+ * - `<AC_LIMIT>` — the `acceptanceCriteria.mediumMax` threshold
1660
+ * the issue tripped.
1661
+ * - `<SOURCES_LIMIT>` — the `sources.mediumMax` threshold the
1662
+ * issue tripped.
1663
+ *
1664
+ * Placeholders use the angle-bracketed uppercase-snake form — not
1665
+ * `{{curly-brace}}` form — because `AgentConfig`'s template
1666
+ * resolver claims the curly-brace namespace at rule generation
1667
+ * time and would rewrite `{{acCount}}` to `<acCount>` before the
1668
+ * agent ever saw it.
1669
+ *
1670
+ * Placeholder substitution is performed by the orchestrator at
1671
+ * runtime — configulator emits the template verbatim.
1521
1672
  */
1522
- readonly excludeRules?: ReadonlyArray<string>;
1673
+ readonly decompositionTemplate?: string;
1674
+ }
1675
+ /*******************************************************************************
1676
+ *
1677
+ * Run Ratio Config
1678
+ *
1679
+ ******************************************************************************/
1680
+ /**
1681
+ * Run-ratio configuration consumed by the `orchestrator` bundle.
1682
+ *
1683
+ * The orchestrator keeps a persistent run counter and interleaves
1684
+ * **dispatch runs** (pick the next ready issue, recommend a worker)
1685
+ * with **housekeeping runs** (batch PR review + maintenance scan) on
1686
+ * a configurable dispatch-to-housekeeping ratio. This mirrors
1687
+ * openhi's `DISPATCHER.md` 4:1 cadence — four dispatch runs feed the
1688
+ * worker queue, then one batched housekeeping run flushes the
1689
+ * review backlog and runs maintenance triage so the pipeline never
1690
+ * drifts.
1691
+ *
1692
+ * The counter persists in a small gitignored JSON state file
1693
+ * (default `.claude/state/orchestrator-runs.json`). Every orchestrator
1694
+ * invocation ticks the counter once and classifies the run based on
1695
+ * `runCounter % (ratio + 1) == 0` — the `ratio + 1`th run in every
1696
+ * cycle is a housekeeping run, all others dispatch.
1697
+ *
1698
+ * Every field is optional. When the whole config is absent the
1699
+ * orchestrator ships with openhi's 4:1 defaults baked in (4 dispatch
1700
+ * runs, 1 housekeeping run, state file at the default path,
1701
+ * `opus` / `sonnet` recommended models).
1702
+ *
1703
+ * Malformed configs — non-integer or non-positive `ratio`, empty or
1704
+ * absolute `stateFilePath` — fail the build at synth time via
1705
+ * `validateRunRatioConfig`.
1706
+ *
1707
+ * @see ./bundles/run-ratio.ts#resolveRunRatio
1708
+ * @see ./bundles/run-ratio.ts#validateRunRatioConfig
1709
+ * @see ./bundles/run-ratio.ts#renderRunRatioSection
1710
+ */
1711
+ interface RunRatioConfig {
1523
1712
  /**
1524
- * Additional content to append to existing rules (from bundles or custom rules).
1525
- * Keys are rule names, values are markdown content appended after a horizontal rule.
1526
- * Use this to supplement bundle rules with project-specific additions without
1527
- * replacing the entire rule.
1528
- *
1529
- * @example
1530
- * ```ts
1531
- * ruleExtensions: {
1532
- * 'typescript-conventions': '## Additional Conventions\n\n- Use branded types for IDs',
1533
- * }
1534
- * ```
1713
+ * Master switch for the run-ratio pipeline. When `false`, every
1714
+ * orchestrator run executes the full dispatch pipeline and no
1715
+ * housekeeping batching is performed; PR review and maintenance
1716
+ * remain manual invocations. Defaults to `true` — ratio-based
1717
+ * batching is on by default.
1535
1718
  */
1536
- readonly ruleExtensions?: Readonly<Record<string, string>>;
1719
+ readonly enabled?: boolean;
1537
1720
  /**
1538
- * Claude Code settings.json configuration.
1539
- * Generated to .claude/settings.json (committed, team-shared).
1721
+ * Number of dispatch runs per housekeeping run. With `ratio = 4`,
1722
+ * runs 1–4 dispatch and run 5 housekeeps; the counter then wraps.
1723
+ * The cycle length is therefore `ratio + 1` runs.
1724
+ *
1725
+ * Must be a positive integer (`ratio >= 1`). Defaults to `4` —
1726
+ * the openhi-published cadence.
1540
1727
  */
1541
- readonly claudeSettings?: ClaudeSettingsConfig;
1728
+ readonly ratio?: number;
1542
1729
  /**
1543
- * Cursor-specific configuration. Generates .cursor/hooks.json for
1544
- * lifecycle hooks and .cursorignore / .cursorindexingignore for
1545
- * file visibility control.
1730
+ * Path to the run-counter state file, relative to the repo root.
1731
+ * The orchestrator reads, increments, and writes back this file on
1732
+ * every invocation. The file is tiny JSON (`{ "run_counter": <n> }`)
1733
+ * and is expected to be gitignored — each operator's orchestrator
1734
+ * session maintains its own counter.
1735
+ *
1736
+ * Must be a non-empty relative path (no leading `/`). Defaults to
1737
+ * `.claude/state/orchestrator-runs.json`.
1546
1738
  */
1547
- readonly cursorSettings?: CursorSettingsConfig;
1739
+ readonly stateFilePath?: string;
1548
1740
  /**
1549
- * Overrides for the output-path roots used by agent bundles
1550
- * (requirements, BCM, profiles, meetings, research). Unset fields
1551
- * fall back to the defaults captured in
1552
- * `bundles/paths.ts#DEFAULT_AGENT_PATHS`.
1741
+ * Human-readable label for the model recommended on dispatch runs.
1742
+ * Rendered verbatim into the orchestrator-conventions rule so the
1743
+ * operator knows which model to run each dispatch session against.
1744
+ * Configulator does **not** set `model:` frontmatter on the
1745
+ * sub-agent — the label is informational.
1553
1746
  *
1554
- * This option is the first of the Group A framework injection
1555
- * points from epic #414. Per-project propagation of these values
1556
- * into bundle rule content lands in a follow-up — setting it today
1557
- * does not yet alter generated rules.
1747
+ * Defaults to `"opus"`.
1558
1748
  */
1559
- readonly paths?: AgentPathsConfig;
1749
+ readonly dispatchModel?: string;
1560
1750
  /**
1561
- * Project-specific priority-detection rules. Each rule declares a
1562
- * match predicate (labels, title regex, body regex, or explicit
1563
- * issue numbers) and a target `priority:*` tier.
1751
+ * Human-readable label for the model recommended on housekeeping
1752
+ * runs. See `dispatchModel` for the rendering contract.
1753
+ * Housekeeping is mechanical (batch PR review + maintenance scan)
1754
+ * so a cheaper model is the documented recommendation.
1564
1755
  *
1565
- * When non-empty, the `base` bundle renders a "Project-specific
1566
- * priority rules" subsection into the `issue-label-conventions`
1567
- * rule. Precedence is **first match wins**; the bundle's default
1568
- * inference heuristics act as the fallback when no rule matches.
1756
+ * Defaults to `"sonnet"`.
1757
+ */
1758
+ readonly housekeepingModel?: string;
1759
+ }
1760
+ /*******************************************************************************
1761
+ *
1762
+ * Pre-flight PR merge Config
1763
+ *
1764
+ ******************************************************************************/
1765
+ /**
1766
+ * Pre-flight PR merge configuration consumed by the `orchestrator`
1767
+ * bundle.
1768
+ *
1769
+ * The pre-flight step (vortex `CLAUDE.md` step 0b) runs **before** the
1770
+ * orchestrator's triage walk so eligible PRs land before the unblock
1771
+ * and queue-scan phases read dependency state. Without it, an issue
1772
+ * whose only remaining blocker is an approved-but-not-yet-merged PR
1773
+ * shows up as blocked on every dispatch cycle — the pipeline thrashes
1774
+ * on stale dependency state.
1775
+ *
1776
+ * The sweep is idempotent: `gh pr merge` on an already-merged PR is a
1777
+ * no-op, so re-running pre-flight on every orchestrator invocation
1778
+ * (dispatch **and** housekeeping) is safe and cheap. Eligibility is
1779
+ * read by the `check-blocked.sh preflight` subcommand and returned as
1780
+ * one line per candidate PR for the orchestrator to act on.
1781
+ *
1782
+ * Every field is optional. When the whole config is absent the
1783
+ * orchestrator ships with vortex's published defaults baked in
1784
+ * (pre-flight enabled, delegated to the `pr-reviewer` sub-agent so the
1785
+ * merge workflow runs on a cheaper model, squash merges, linked-issue
1786
+ * keyword required).
1787
+ *
1788
+ * Malformed configs — unknown `mergeMethod`, empty / whitespace-only
1789
+ * `eligibleLabels` entries — fail the build at synth time via
1790
+ * `validatePreflightPrConfig`.
1791
+ *
1792
+ * @see ./bundles/preflight-pr.ts#resolvePreflightPr
1793
+ * @see ./bundles/preflight-pr.ts#validatePreflightPrConfig
1794
+ * @see ./bundles/preflight-pr.ts#renderPreflightPrSection
1795
+ */
1796
+ interface PreflightPrConfig {
1797
+ /**
1798
+ * Master switch for the pre-flight sweep. When `false`, the
1799
+ * orchestrator skips pre-flight entirely; PR merges land via the
1800
+ * existing batch PR review step on housekeeping runs or via a
1801
+ * human operator.
1569
1802
  *
1570
- * @see PriorityRule
1571
- * @see ./bundles/priority-rules.ts#renderPriorityRulesSection
1803
+ * Defaults to `true` — pre-flight is on by default. Repos that
1804
+ * want to keep merges manual should set this to `false` explicitly.
1572
1805
  */
1573
- readonly priorityRules?: ReadonlyArray<PriorityRule>;
1806
+ readonly enabled?: boolean;
1574
1807
  /**
1575
- * Focus-scoring configuration. Declares the path to the consuming
1576
- * repo's `focus.json` file, score thresholds, and the
1577
- * agent-expansion rules that govern what agents may append to the
1578
- * file.
1808
+ * Whether the orchestrator delegates the pre-flight sweep to the
1809
+ * `pr-reviewer` sub-agent. Mirrors vortex's step 0b contract:
1810
+ * invoking the reviewer as a sub-agent lets the merge workflow run
1811
+ * on its own (cheaper) model rather than on the orchestrator's
1812
+ * more expensive model budget.
1579
1813
  *
1580
- * When set, the `base` bundle appends a "Focus scoring"
1581
- * subsection to the `issue-label-conventions` rule that teaches
1582
- * agents (a) how to read `focus.json`, (b) how focus weight
1583
- * interacts with the `priority:*` taxonomy, and (c) the
1584
- * agent-driven expansion contract. The actual `focus.json` file
1585
- * is authored and curated in the consuming repo — configulator
1586
- * ships the schema and agent instructions only.
1814
+ * Set to `false` to have the orchestrator merge eligible PRs inline
1815
+ * without delegation (useful in pipelines that have not wired a
1816
+ * `pr-reviewer` sub-agent).
1587
1817
  *
1588
- * @see FocusConfig
1589
- * @see FocusArea
1590
- * @see AgentExpansionRules
1591
- * @see ./bundles/focus.ts#renderFocusSection
1818
+ * Defaults to `true`.
1592
1819
  */
1593
- readonly focus?: FocusConfig;
1820
+ readonly delegateToPrReviewer?: boolean;
1594
1821
  /**
1595
- * Meeting-analysis injection points typed configs the
1596
- * `meeting-analysis` bundle consults when classifying, routing, and
1597
- * templating meetings. Supplies the meeting-type taxonomy, the
1598
- * area doc-root routing map, and the agenda-template root used
1599
- * by the (future) `agenda` bundle.
1600
- *
1601
- * When `meetingTypes` is non-empty, the `meeting-analysis` bundle
1602
- * appends a "Recognized meeting types" subsection to the
1603
- * `meeting-processing-workflow` rule. When `meetingAreas` is
1604
- * non-empty, it appends an "Area → doc-root mapping" subsection.
1605
- * When both are empty or unset, the generated rule content is
1606
- * unchanged from the no-config baseline.
1822
+ * Merge method used when the orchestrator merges a PR inline
1823
+ * (`delegateToPrReviewer = false`). Maps to the `gh pr merge`
1824
+ * flags: `squash` `--squash`, `merge` `--merge`, `rebase`
1825
+ * → `--rebase`.
1607
1826
  *
1608
- * @see MeetingsConfig
1609
- * @see MeetingType
1610
- * @see MeetingArea
1611
- * @see ./bundles/meeting-types.ts#renderMeetingTypesSection
1827
+ * Defaults to `"squash"` — squash-and-merge matches every existing
1828
+ * configulator consumer and keeps `main` free of
1829
+ * branch-construction noise.
1612
1830
  */
1613
- readonly meetings?: MeetingsConfig;
1831
+ readonly mergeMethod?: "squash" | "merge" | "rebase";
1614
1832
  /**
1615
- * Framework injection points for source-tier customization and
1616
- * custom doc sections.
1833
+ * Whether pre-flight skips PRs that lack a
1834
+ * `Closes/Fixes/Resolves #<n>` keyword in the body. Most pipelines
1835
+ * require a linked issue so the dependency graph stays intact, so
1836
+ * the safe default is `true` — pre-flight only merges PRs that
1837
+ * cleanly complete a known issue.
1617
1838
  *
1618
- * - `sourceTierExamples` domain-specific examples injected under
1619
- * T1 / T2 / T3 / T4 in the base bundle's "Source Quality &
1620
- * Verification" rule.
1621
- * - `customDocSections` — consumer-supplied section templates that
1622
- * render verbatim after an existing section heading in a target
1623
- * bundle's rule content.
1839
+ * Set to `false` in repos that accept human-authored PRs with no
1840
+ * linked issue (docs-only changes, dependency bumps, etc.) and
1841
+ * still want pre-flight to land them.
1624
1842
  *
1625
- * Named feature toggles (`consortium-model`, `stealth-mode`, etc.)
1626
- * are intentionally out of scope here — build those on top of
1627
- * `customDocSections` inside the consuming repo's projen config.
1843
+ * Defaults to `true`.
1844
+ */
1845
+ readonly requireLinkedIssue?: boolean;
1846
+ /**
1847
+ * Optional allowlist of labels that, when present on a PR, gate
1848
+ * eligibility. When the list is empty (the default) every open PR
1849
+ * that otherwise satisfies the eligibility checks qualifies;
1850
+ * supplying a non-empty list restricts pre-flight to PRs carrying
1851
+ * at least one of the listed labels.
1628
1852
  *
1629
- * @see AgentFeaturesConfig
1630
- * @see SourceTierExamples
1631
- * @see CustomDocSection
1632
- * @see ./bundles/features.ts
1853
+ * Use this to opt specific pipelines in — for example,
1854
+ * `['origin:issue-worker']` restricts pre-flight to bot-authored
1855
+ * PRs, leaving human-authored PRs for the normal review path.
1856
+ *
1857
+ * Every entry must be a non-empty string; empty / whitespace-only
1858
+ * entries fail the build via `validatePreflightPrConfig`.
1633
1859
  */
1634
- readonly features?: AgentFeaturesConfig;
1860
+ readonly eligibleLabels?: ReadonlyArray<string>;
1635
1861
  }
1636
-
1862
+ /*******************************************************************************
1863
+ *
1864
+ * Unblock Dependents Config
1865
+ *
1866
+ ******************************************************************************/
1637
1867
  /**
1638
- * Generates AI coding assistant configuration files from a common schema.
1868
+ * Agent-driven unblocking configuration consumed by the `orchestrator`
1869
+ * bundle.
1639
1870
  *
1640
- * Supports Cursor and Claude Code (initial release), with Codex and Copilot
1641
- * renderers planned for future issues. Rules, skills, and sub-agents are
1642
- * defined once and rendered into the correct format for each target platform.
1871
+ * After any agent applies `status:done` to an issue, it runs a
1872
+ * targeted sweep against that issue's dependents open issues whose
1873
+ * body contains `Depends on: #<just-closed>`. Dependents whose full
1874
+ * dependency list is now closed flip from `status:blocked` to
1875
+ * `status:ready` immediately, without waiting for the next
1876
+ * orchestrator dispatch cycle. The sweep is implemented by the
1877
+ * shipped `.claude/procedures/unblock-dependents.sh` script.
1643
1878
  *
1644
- * Follows the configulator component pattern: extends Component, static .of()
1645
- * factory, options interface with JSDoc.
1879
+ * Every field is optional. When the whole config is absent the
1880
+ * orchestrator ships with the sweep **enabled** and a generic
1881
+ * "Dependencies resolved by #<n> — unblocking." citation comment.
1646
1882
  *
1647
- * @example
1648
- * ```ts
1649
- * new AgentConfig(project, {
1650
- * rules: [{
1651
- * name: 'my-rule',
1652
- * description: 'Project conventions',
1653
- * scope: AGENT_RULE_SCOPE.ALWAYS,
1654
- * content: '# My Rule\n\nFollow these conventions...',
1655
- * }],
1656
- * });
1657
- * ```
1883
+ * Malformed configs — empty / whitespace-only `commentTemplate` or
1884
+ * `partialUnblockCommentTemplate` — fail the build at synth time via
1885
+ * `validateUnblockDependentsConfig`.
1886
+ *
1887
+ * @see ./bundles/unblock-dependents.ts#resolveUnblockDependents
1888
+ * @see ./bundles/unblock-dependents.ts#validateUnblockDependentsConfig
1889
+ * @see ./bundles/unblock-dependents.ts#renderUnblockDependentsSection
1658
1890
  */
1659
- declare class AgentConfig extends Component {
1891
+ interface UnblockDependentsConfig {
1660
1892
  /**
1661
- * Find the AgentConfig component on a project.
1893
+ * Master switch for the agent-driven unblock sweep. When `false`,
1894
+ * agents skip the targeted sweep after applying `status:done`;
1895
+ * dependents wait for the next orchestrator dispatch (Phase C) to
1896
+ * pick up the resolved dependency.
1897
+ *
1898
+ * Defaults to `true` — the sweep is on by default. Repos that
1899
+ * want to keep label transitions manual should set this to `false`
1900
+ * explicitly.
1662
1901
  */
1663
- static of(project: Project$1): AgentConfig | undefined;
1902
+ readonly enabled?: boolean;
1664
1903
  /**
1665
- * Returns `true` when at least one tier array on the supplied
1666
- * `SourceTierExamples` is non-empty, signalling that the consuming
1667
- * repo has opted into rendering the base bundle's
1668
- * `source-quality-verification` rule. Returns `false` for
1669
- * `undefined`, `{}`, or a fully-empty `{ t1: [], t2: [], t3: [], t4: [] }`.
1904
+ * Override for the citation comment posted on each fully-unblocked
1905
+ * dependent. The string is interpolated at runtime by the shipped
1906
+ * shell script: `<CLOSED_ISSUE>` is replaced with the resolving
1907
+ * issue's `#<n>` reference.
1908
+ *
1909
+ * The placeholder syntax deliberately avoids `{{curly-brace}}` —
1910
+ * `AgentConfig`'s template resolver claims that namespace at rule
1911
+ * generation time.
1912
+ *
1913
+ * Defaults to `"Dependencies resolved by <CLOSED_ISSUE> — unblocking."`.
1670
1914
  */
1671
- private static hasActiveTierExamples;
1915
+ readonly commentTemplate?: string;
1672
1916
  /**
1673
- * Merges default Claude permissions with bundle and user-supplied settings.
1917
+ * Whether to post a partial-unblock comment on a dependent whose
1918
+ * full dependency list is **not** yet fully closed. When `true`,
1919
+ * each intermediate dependency resolution leaves a trail of
1920
+ * "still waiting on X" comments on the dependent — useful for
1921
+ * operator visibility on long dependency chains. When `false`,
1922
+ * partial resolutions are logged to the script's stdout only and
1923
+ * the dependent issue stays silent until the final dep closes.
1674
1924
  *
1675
- * Merge order: defaults bundle permissions user-supplied entries.
1676
- * `defaultMode` defaults to `"dontAsk"` unless overridden.
1925
+ * Defaults to `false` keeps issue threads clean by default.
1677
1926
  */
1678
- private static mergeClaudeDefaults;
1679
- private readonly options;
1680
- constructor(project: Project$1, options?: AgentConfigOptions);
1927
+ readonly flagPartialUnblockWithAttention?: boolean;
1681
1928
  /**
1682
- * Returns the bundles that are active for this project: auto-detected
1683
- * bundles (when `autoDetectBundles !== false`) plus force-included
1684
- * bundles, minus explicitly excluded bundles. Deduplicated by name.
1929
+ * Override for the partial-unblock comment posted when
1930
+ * `flagPartialUnblockWithAttention` is `true`. The string is
1931
+ * interpolated at runtime: `<CLOSED_ISSUE>` is replaced with the
1932
+ * just-resolved issue's `#<n>` reference, and `<OPEN_DEPS>` with
1933
+ * the space-separated list of remaining open dependencies
1934
+ * (e.g. `#45 #47`).
1685
1935
  *
1686
- * Exposed so sibling components (e.g. the sync-labels workflow) can
1687
- * consume bundle-contributed configuration.
1936
+ * Defaults to `"Dependency <CLOSED_ISSUE> resolved, but still waiting on: <OPEN_DEPS>."`.
1688
1937
  */
1689
- get activeBundles(): ReadonlyArray<AgentRuleBundle>;
1690
- preSynthesize(): void;
1691
- private resolvePlatforms;
1692
- private resolveRules;
1938
+ readonly partialUnblockCommentTemplate?: string;
1939
+ }
1940
+ /*******************************************************************************
1941
+ *
1942
+ * Progress Files Config
1943
+ *
1944
+ ******************************************************************************/
1945
+ /**
1946
+ * Progress-file convention consumed by the `base` bundle and every
1947
+ * phased-agent bundle (bcm-writer, research-pipeline, etc.).
1948
+ *
1949
+ * Every phased agent session writes a small progress file to disk as
1950
+ * its first action after claiming an issue, updates it after each
1951
+ * non-trivial step, and deletes it in the final commit that closes
1952
+ * the issue. If the session crashes, the next session reads the
1953
+ * progress file, confirms on-disk state matches reality, and resumes
1954
+ * from the next uncompleted step rather than starting from scratch.
1955
+ *
1956
+ * The convention complements the stale-branch decision tree — clone
1957
+ * recovery returns the checkout to the default branch; the progress
1958
+ * file restores the *deliverable* to a partially-complete state so
1959
+ * resumed work can build on it.
1960
+ *
1961
+ * Every field is optional. When the whole config is absent the
1962
+ * convention ships **enabled** with JSON-formatted files stored under
1963
+ * `.claude/state/<issue-number>-progress.json`.
1964
+ *
1965
+ * Malformed configs — empty / whitespace-only or absolute `stateDir`,
1966
+ * empty / whitespace-only `filenamePattern`, `filenamePattern` missing
1967
+ * the `<ISSUE_NUMBER>` placeholder, unknown `format`, non-positive
1968
+ * `staleAfterHours` — fail the build at synth time via
1969
+ * `validateProgressFilesConfig`.
1970
+ *
1971
+ * @see ./bundles/progress-files.ts#resolveProgressFiles
1972
+ * @see ./bundles/progress-files.ts#validateProgressFilesConfig
1973
+ * @see ./bundles/progress-files.ts#renderProgressFilesRuleContent
1974
+ */
1975
+ interface ProgressFilesConfig {
1976
+ /**
1977
+ * Master switch for the progress-file convention. When `false`,
1978
+ * the base bundle renders a short stub stating the project does not
1979
+ * enforce progress files; phased-agent bundles skip the
1980
+ * per-workflow "Progress File" injection. Partial-resume guidance
1981
+ * still renders because it applies even without a progress file.
1982
+ *
1983
+ * Defaults to `true` — the convention is on by default.
1984
+ */
1985
+ readonly enabled?: boolean;
1986
+ /**
1987
+ * Root directory (relative to the repo root) where progress files
1988
+ * are written. Must be a non-empty relative path (no leading `/`).
1989
+ * The directory is added to the project's `.gitignore` at synth
1990
+ * time so progress files never land on the default branch.
1991
+ *
1992
+ * Defaults to `.claude/state`.
1993
+ */
1994
+ readonly stateDir?: string;
1995
+ /**
1996
+ * Filename pattern for an individual progress file. The
1997
+ * `<ISSUE_NUMBER>` placeholder is substituted at runtime with the
1998
+ * numeric id of the issue the agent is working on (e.g.
1999
+ * `479-progress.json`).
2000
+ *
2001
+ * Must contain the `<ISSUE_NUMBER>` placeholder and must not
2002
+ * contain a `/` (use `stateDir` for the directory).
2003
+ *
2004
+ * The placeholder uses the angle-bracketed uppercase-snake form —
2005
+ * not `{{curly-brace}}` form — because `AgentConfig`'s template
2006
+ * resolver claims the curly-brace namespace at rule generation
2007
+ * time.
2008
+ *
2009
+ * Defaults to `"<ISSUE_NUMBER>-progress.json"`.
2010
+ */
2011
+ readonly filenamePattern?: string;
2012
+ /**
2013
+ * Serialization format for the progress-file body.
2014
+ *
2015
+ * - `"json"` (default) — machine-parseable JSON with a typed
2016
+ * schema. Preferred when scripted resume logic reads the file.
2017
+ * - `"markdown"` — human-readable markdown with a YAML frontmatter
2018
+ * block. Preferred for projects that treat the progress file as
2019
+ * an operator-visible log.
2020
+ */
2021
+ readonly format?: "json" | "markdown";
2022
+ /**
2023
+ * Whether the final commit that closes the issue must delete the
2024
+ * progress file. When `true` (the default), progress files are a
2025
+ * working-branch artefact and never land on the default branch.
2026
+ * When `false`, progress files are retained as an audit trail.
2027
+ *
2028
+ * Defaults to `true`.
2029
+ */
2030
+ readonly cleanupOnComplete?: boolean;
2031
+ /**
2032
+ * Stale-threshold in hours for the stale-branch decision tree. A
2033
+ * branch whose progress file's `last_updated` is older than this
2034
+ * many hours **and** that has no matching open PR is considered
2035
+ * abandoned. Rendered verbatim into the stale-branch documentation
2036
+ * so operators have a single authoritative number.
2037
+ *
2038
+ * Must be a positive integer. Defaults to `72` — matches the
2039
+ * orchestrator bundle's in-progress staleness threshold.
2040
+ */
2041
+ readonly staleAfterHours?: number;
2042
+ }
2043
+ /*******************************************************************************
2044
+ *
2045
+ * Shared Editing Config
2046
+ *
2047
+ ******************************************************************************/
2048
+ /**
2049
+ * Shared-editing safety convention consumed by the `base` bundle and
2050
+ * every phased-agent bundle that writes rows to a shared registry or
2051
+ * feature-matrix file.
2052
+ *
2053
+ * Multiple concurrent agent sessions frequently need to edit the same
2054
+ * index file — registry `README.md` / `index.md` row tables, category
2055
+ * landing pages, feature matrices. Without a shared contract, parallel
2056
+ * sessions conflict on the index even when their content contributions
2057
+ * are independent, and the resolver may accidentally drop a row.
2058
+ *
2059
+ * The convention covers: pre-edit read-latest, single-entry
2060
+ * deterministic-sort inserts, commit-path verification (read-back the
2061
+ * committed file, assert the new row is present exactly once), and a
2062
+ * scripted merge-conflict resolution recipe.
2063
+ *
2064
+ * Every field is optional. When the whole config is absent the
2065
+ * convention ships **enabled** with the documented default set of
2066
+ * shared index path patterns and the rebase-based conflict strategy.
2067
+ *
2068
+ * Malformed configs — empty `sharedIndexPaths`, empty /
2069
+ * whitespace-only path entry, unknown `conflictStrategy` — fail the
2070
+ * build at synth time via `validateSharedEditingConfig`.
2071
+ *
2072
+ * @see ./bundles/shared-editing.ts#resolveSharedEditing
2073
+ * @see ./bundles/shared-editing.ts#validateSharedEditingConfig
2074
+ * @see ./bundles/shared-editing.ts#renderSharedEditingRuleContent
2075
+ */
2076
+ interface SharedEditingConfig {
2077
+ /**
2078
+ * Master switch for the shared-editing convention. When `false`,
2079
+ * the base bundle renders a short stub stating the project does not
2080
+ * enforce the convention; phased-agent bundles skip the
2081
+ * per-workflow "Shared Index Editing" injection.
2082
+ *
2083
+ * Defaults to `true` — the convention is on by default.
2084
+ */
2085
+ readonly enabled?: boolean;
2086
+ /**
2087
+ * Path patterns (plain glob strings) that identify shared index
2088
+ * files. Rendered verbatim into the rule body as a bullet list;
2089
+ * agents match the file they are about to edit against the patterns
2090
+ * to decide whether the contract applies.
2091
+ *
2092
+ * Must be a non-empty array of non-empty strings.
2093
+ *
2094
+ * Defaults to the configulator-wide set covering docs-site
2095
+ * `index.md` / `README.md` registry tables and feature-matrix
2096
+ * files.
2097
+ */
2098
+ readonly sharedIndexPaths?: ReadonlyArray<string>;
2099
+ /**
2100
+ * Whether the rendered convention includes the commit-path
2101
+ * verification protocol (read-back the committed file, assert the
2102
+ * new row is present exactly once). The verification step catches
2103
+ * staging / path bugs that would otherwise silently drop a row.
2104
+ *
2105
+ * Defaults to `true` — verification is on by default.
2106
+ */
2107
+ readonly verifyCommit?: boolean;
2108
+ /**
2109
+ * Strategy the convention's merge-conflict recipe prescribes when
2110
+ * two agents both add a row to the same shared index:
2111
+ *
2112
+ * - `"rebase"` (default) — `git pull --rebase` the branch, re-insert
2113
+ * the new row in sort order, resolve, `git rebase --continue`.
2114
+ * - `"merge"` — `git pull` (fast-forward or merge commit), re-insert
2115
+ * the row, `git commit`. Use for projects that keep a merge-commit
2116
+ * history on feature branches.
2117
+ */
2118
+ readonly conflictStrategy?: "rebase" | "merge";
2119
+ /**
2120
+ * Whether the convention emits the
2121
+ * `.claude/procedures/verify-index-row.sh` helper to disk. The
2122
+ * helper implements the commit-path verification step in a single
2123
+ * shell invocation; consumers that prefer the inline
2124
+ * `git show HEAD:<path>` recipe can leave it disabled.
2125
+ *
2126
+ * Defaults to `false` — the helper is opt-in.
2127
+ */
2128
+ readonly emitHelper?: boolean;
2129
+ }
2130
+ /*******************************************************************************
2131
+ *
2132
+ * Skill Evals Config
2133
+ *
2134
+ ******************************************************************************/
2135
+ /**
2136
+ * Skill eval harness convention consumed by the `base` bundle and
2137
+ * every skill-owning bundle (requirements-writer, bcm-writer, etc.).
2138
+ *
2139
+ * Each skill under `<skillsRoot>/<skill-name>/` may ship a regression
2140
+ * suite at `<skillsRoot>/<skill-name>/evals/evals.json`. Suites are
2141
+ * declarative prompt / expected-output fixtures parameterised by a
2142
+ * shared **product-context** fixture (by default
2143
+ * `docs/src/content/docs/project-context.md`) so the same eval shape
2144
+ * works across every project that depends on configulator — each
2145
+ * consuming repo supplies its own `project-context.md`, not its own
2146
+ * forked eval files.
2147
+ *
2148
+ * The convention is declarative: the optional runner script shipped
2149
+ * by `emitRunner: true` walks the skills root, validates every
2150
+ * `evals.json` against the schema, resolves the product-context
2151
+ * fixture, and emits a JSON execution plan to stdout. It never
2152
+ * invokes an LLM itself — the plan is consumed by whatever human or
2153
+ * model actually replays the prompts against the skill.
2154
+ *
2155
+ * Every field is optional. When the whole config is absent the
2156
+ * convention ships **enabled** with the documented default paths,
2157
+ * product-context required, and the runner script opt-in.
2158
+ *
2159
+ * Malformed configs — empty / whitespace-only or absolute
2160
+ * `skillsRoot`, empty / whitespace-only or absolute
2161
+ * `productContextPath` — fail the build at synth time via
2162
+ * `validateSkillEvalsConfig`.
2163
+ *
2164
+ * @see ./bundles/skill-evals.ts#resolveSkillEvals
2165
+ * @see ./bundles/skill-evals.ts#validateSkillEvalsConfig
2166
+ * @see ./bundles/skill-evals.ts#renderSkillEvalsRuleContent
2167
+ */
2168
+ interface SkillEvalsConfig {
2169
+ /**
2170
+ * Master switch for the skill-eval harness convention. When `false`,
2171
+ * the base bundle renders a short stub stating the project does not
2172
+ * ship skill evals; skill-owning bundles skip their per-bundle
2173
+ * "Skill Evals" injection and the optional runner script is not
2174
+ * emitted even if `emitRunner: true`.
2175
+ *
2176
+ * Defaults to `true` — the convention is on by default.
2177
+ */
2178
+ readonly enabled?: boolean;
2179
+ /**
2180
+ * Root directory (relative to the repo root) under which skill
2181
+ * SKILL.md files live. The runner walks this directory to discover
2182
+ * eval suites at `<skillsRoot>/<skill-name>/evals/evals.json`.
2183
+ *
2184
+ * Must be a non-empty relative path (no leading `/`).
2185
+ *
2186
+ * Defaults to `.claude/skills`, which matches the path every
2187
+ * configulator-managed project ships skills to on disk.
2188
+ */
2189
+ readonly skillsRoot?: string;
2190
+ /**
2191
+ * Path (relative to the repo root) to the product-context fixture
2192
+ * every eval suite references by default. A per-suite
2193
+ * `product_context` field in an `evals.json` overrides this value
2194
+ * for that suite only.
2195
+ *
2196
+ * Must be a non-empty relative path (no leading `/`).
2197
+ *
2198
+ * Defaults to `docs/src/content/docs/project-context.md`, which is
2199
+ * the file every configulator-managed agent already loads at
2200
+ * session start.
2201
+ */
2202
+ readonly productContextPath?: string;
2203
+ /**
2204
+ * Whether the runner fails fast when the product-context fixture is
2205
+ * missing. The default (`true`) is deliberately strict — an eval
2206
+ * that silently runs without its fixture produces a false-positive
2207
+ * pass. Projects bootstrapping a new consuming repo that has not
2208
+ * yet authored its `project-context.md` can set this to `false`,
2209
+ * at which point a missing fixture becomes a stderr warning rather
2210
+ * than a hard failure.
2211
+ *
2212
+ * Defaults to `true`.
2213
+ */
2214
+ readonly requireProductContext?: boolean;
2215
+ /**
2216
+ * Whether the convention emits the
2217
+ * `.claude/procedures/run-skill-evals.sh` helper to disk. The
2218
+ * helper implements the full runner contract (discover, validate,
2219
+ * resolve product-context, emit JSON plan) in a single shell
2220
+ * invocation. Consumers that prefer to roll their own runner can
2221
+ * leave it disabled and follow the inline recipe documented in the
2222
+ * rule body.
2223
+ *
2224
+ * Defaults to `false` — the helper is opt-in.
2225
+ */
2226
+ readonly emitRunner?: boolean;
2227
+ }
2228
+ /*******************************************************************************
2229
+ *
2230
+ * Workflow Diagrams Config
2231
+ *
2232
+ ******************************************************************************/
2233
+ /**
2234
+ * Workflow-diagrams convention consumed by the `base` bundle and
2235
+ * every phased-agent bundle. Documents the single hand-authored
2236
+ * Mermaid-based diagrams page that visualises every agent's phase
2237
+ * graph and every cross-agent handoff, and enforces the
2238
+ * **diagram-touched-when-bundle-touched** rule: a change set that
2239
+ * modifies a bundle's phase graph must also update the matching
2240
+ * section in the diagrams page.
2241
+ *
2242
+ * The convention is deliberately content-free — configulator cannot
2243
+ * ship meaningful diagrams because each consuming repo enables a
2244
+ * different subset of bundles and customises agent labels, paths,
2245
+ * and taxonomies via the Group A injection points. Instead the
2246
+ * bundle renders the rule (what to author, when to update it) and
2247
+ * optionally emits a starter page + a checker script.
2248
+ *
2249
+ * Every field is optional. When the whole config is absent the
2250
+ * convention ships **enabled** with the documented default diagrams
2251
+ * path (`docs/src/content/docs/agents/workflows.md`), the default
2252
+ * bundle-path patterns, the hard-requirement phrasing, the starter
2253
+ * page opt-in, and the checker script opt-in.
2254
+ *
2255
+ * Malformed configs — empty / whitespace-only or absolute
2256
+ * `diagramsPath`, empty `bundlePathPatterns`, empty /
2257
+ * whitespace-only pattern entry — fail the build at synth time via
2258
+ * `validateWorkflowDiagramsConfig`.
2259
+ *
2260
+ * @see ./bundles/workflow-diagrams.ts#resolveWorkflowDiagrams
2261
+ * @see ./bundles/workflow-diagrams.ts#validateWorkflowDiagramsConfig
2262
+ * @see ./bundles/workflow-diagrams.ts#renderWorkflowDiagramsRuleContent
2263
+ */
2264
+ interface WorkflowDiagramsConfig {
2265
+ /**
2266
+ * Master switch for the workflow-diagrams convention. When `false`,
2267
+ * the base bundle renders a short stub stating the project does not
2268
+ * enforce the convention; phased-agent bundles skip the
2269
+ * per-workflow "Workflow Diagram" injection and the optional helper
2270
+ * script / starter page are not emitted even if their `emit*`
2271
+ * flags are true.
2272
+ *
2273
+ * Defaults to `true` — the convention is on by default.
2274
+ */
2275
+ readonly enabled?: boolean;
2276
+ /**
2277
+ * Repo-relative path to the single workflow-diagrams page. The
2278
+ * rendered rule cites this path as the on-disk home of every
2279
+ * Mermaid diagram; the checker script uses it as the sentinel path
2280
+ * that must appear in a change set when any bundle file is
2281
+ * touched.
2282
+ *
2283
+ * Must be a non-empty relative path (no leading `/`).
2284
+ *
2285
+ * Defaults to `docs/src/content/docs/agents/workflows.md`, which
2286
+ * matches the monorepo-wide singleton `/docs` Starlight site every
2287
+ * configulator-managed repo ships.
2288
+ */
2289
+ readonly diagramsPath?: string;
2290
+ /**
2291
+ * Path patterns (bash-style globs) that identify "bundle files" —
2292
+ * the source files whose edits require the workflow-diagrams page
2293
+ * to be touched in the same change set. Rendered verbatim into
2294
+ * the rule body as a bullet list and emitted into the checker
2295
+ * script when `emitChecker: true`.
2296
+ *
2297
+ * Must be a non-empty array of non-empty strings.
2298
+ *
2299
+ * Defaults to the configulator-wide set covering in-tree bundle
2300
+ * source files, `.claude/agents/**.md` agent prompts, and
2301
+ * `.claude/skills/**.md` skill prompts.
2302
+ */
2303
+ readonly bundlePathPatterns?: ReadonlyArray<string>;
2304
+ /**
2305
+ * Whether the convention emits a minimal starter diagrams page to
2306
+ * disk at `<diagramsPath>`. The starter carries the expected
2307
+ * structure (master diagram placeholder, one example agent section,
2308
+ * legend) so consumers adopting the convention on a green-field
2309
+ * repo have a working template to extend.
2310
+ *
2311
+ * Disabled by default because the page is hand-authored — an
2312
+ * emitted stub would conflict with existing content on repos
2313
+ * adopting the convention late.
2314
+ */
2315
+ readonly emitStarterDiagram?: boolean;
2316
+ /**
2317
+ * Whether the convention emits the
2318
+ * `.claude/procedures/check-workflow-diagrams.sh` helper to disk.
2319
+ * The script walks a newline-separated list of changed files (from
2320
+ * stdin or positional arguments) and fails non-zero when any file
2321
+ * matches a bundle-path pattern but `<diagramsPath>` is not also
2322
+ * in the list.
2323
+ *
2324
+ * Disabled by default — the helper is opt-in for repos that want a
2325
+ * hard CI gate or pre-commit hook. Consumers that prefer to
2326
+ * enforce the rule via review discipline alone can leave it off.
2327
+ */
2328
+ readonly emitChecker?: boolean;
2329
+ /**
2330
+ * Whether the rendered rule body phrases the diagram update as a
2331
+ * **hard requirement** (`MUST`) or a **strong recommendation**
2332
+ * (`SHOULD`). Defaults to `true` — the hard-requirement phrasing
2333
+ * matches the "enforced via CI" posture the convention is
2334
+ * designed for. Consumers that treat diagrams as aspirational can
2335
+ * soften the phrasing by setting this to `false`.
2336
+ */
2337
+ readonly requireDiagramUpdate?: boolean;
2338
+ }
2339
+ /*******************************************************************************
2340
+ *
2341
+ * Issue Templates Config
2342
+ *
2343
+ ******************************************************************************/
2344
+ /**
2345
+ * Issue-templates convention consumed by the `base` bundle and every
2346
+ * phased-agent bundle that files downstream issues. Documents the
2347
+ * single hand-authored reference page that carries one canonical
2348
+ * `gh issue create` recipe per downstream phase label, and enforces
2349
+ * the **reference-don't-inline** rule: bundle rules and agent prompts
2350
+ * cite the matching section of that page instead of duplicating a
2351
+ * full `gh issue create --title ... --label ... --body ...`
2352
+ * invocation.
2353
+ *
2354
+ * The convention is deliberately content-free — configulator cannot
2355
+ * ship meaningful templates because each consuming repo enables a
2356
+ * different subset of bundles and customises phase labels, tier
2357
+ * taxonomies, and body conventions via the Group A injection points.
2358
+ * Instead the bundle renders the rule (what to author, when to cite
2359
+ * it) and optionally emits a starter page + a lint script.
2360
+ *
2361
+ * Every field is optional. When the whole config is absent the
2362
+ * convention ships **enabled** with the documented default templates
2363
+ * path (`docs/src/content/docs/agents/issue-templates.md`), the
2364
+ * default bundle-path patterns, the hard-requirement phrasing, and
2365
+ * both the starter page and the lint script opt-in.
2366
+ *
2367
+ * Malformed configs — empty / whitespace-only or absolute
2368
+ * `templatesPath`, empty `bundlePathPatterns`, empty /
2369
+ * whitespace-only pattern entry — fail the build at synth time via
2370
+ * `validateIssueTemplatesConfig`.
2371
+ *
2372
+ * @see ./bundles/issue-templates.ts#resolveIssueTemplates
2373
+ * @see ./bundles/issue-templates.ts#validateIssueTemplatesConfig
2374
+ * @see ./bundles/issue-templates.ts#renderIssueTemplatesRuleContent
2375
+ */
2376
+ interface IssueTemplatesConfig {
2377
+ /**
2378
+ * Master switch for the issue-templates convention. When `false`,
2379
+ * the base bundle renders a short stub stating the project does not
2380
+ * enforce the convention; phased-agent bundles skip the per-workflow
2381
+ * "Issue Templates" injection and the optional helper script /
2382
+ * starter page are not emitted even if their `emit*` flags are
2383
+ * true.
2384
+ *
2385
+ * Defaults to `true` — the convention is on by default.
2386
+ */
2387
+ readonly enabled?: boolean;
2388
+ /**
2389
+ * Repo-relative path to the single issue-templates reference page.
2390
+ * The rendered rule cites this path as the on-disk home of every
2391
+ * `gh issue create` recipe; the lint script uses it as the
2392
+ * allow-listed sentinel path that is permitted to contain full
2393
+ * recipes.
2394
+ *
2395
+ * Must be a non-empty relative path (no leading `/`).
2396
+ *
2397
+ * Defaults to `docs/src/content/docs/agents/issue-templates.md`,
2398
+ * which matches the monorepo-wide singleton `/docs` Starlight site
2399
+ * every configulator-managed repo ships.
2400
+ */
2401
+ readonly templatesPath?: string;
2402
+ /**
2403
+ * Path patterns (bash-style globs) that identify "bundle files" —
2404
+ * the source files composing agent prompts and skill instructions.
2405
+ * Rendered verbatim into the rule body as a bullet list and emitted
2406
+ * into the lint script when `emitChecker: true`.
2407
+ *
2408
+ * Must be a non-empty array of non-empty strings.
2409
+ *
2410
+ * Defaults to the configulator-wide set covering in-tree bundle
2411
+ * source files, `.claude/agents/**.md` agent prompts, and
2412
+ * `.claude/skills/**.md` skill prompts.
2413
+ */
2414
+ readonly bundlePathPatterns?: ReadonlyArray<string>;
2415
+ /**
2416
+ * Whether the convention emits the
2417
+ * `.claude/procedures/check-issue-templates.sh` lint to disk. The
2418
+ * script walks a newline-separated list of changed files (from
2419
+ * stdin or positional arguments) and fails non-zero when any file
2420
+ * matches a bundle-path pattern and contains a multi-line
2421
+ * `gh issue create ... --title` invocation.
2422
+ *
2423
+ * Disabled by default — the lint is opt-in for repos that want a
2424
+ * hard CI gate or pre-commit hook. Consumers that prefer to
2425
+ * enforce the rule via review discipline alone can leave it off.
2426
+ */
2427
+ readonly emitChecker?: boolean;
2428
+ /**
2429
+ * Whether the convention emits a minimal starter templates page to
2430
+ * disk at `<templatesPath>`. The starter carries the expected
2431
+ * structure (how-to-use preamble + one example
2432
+ * `## Template: <phase-label>` section) so consumers adopting the
2433
+ * convention on a green-field repo have a working template to
2434
+ * extend.
2435
+ *
2436
+ * Disabled by default because the page is hand-authored — an
2437
+ * emitted stub would conflict with existing content on repos
2438
+ * adopting the convention late.
2439
+ */
2440
+ readonly emitStarterDoc?: boolean;
2441
+ /**
2442
+ * Whether the rendered rule body phrases the reference-don't-inline
2443
+ * rule as a **hard requirement** (`MUST`) or a **strong
2444
+ * recommendation** (`SHOULD`). Defaults to `true` — the
2445
+ * hard-requirement phrasing matches the consolidation goal the
2446
+ * convention is designed for. Consumers that treat consolidation
2447
+ * as aspirational can soften the phrasing by setting this to
2448
+ * `false`.
2449
+ */
2450
+ readonly requireReference?: boolean;
2451
+ }
2452
+ /*******************************************************************************
2453
+ *
2454
+ * Scheduled Tasks Config
2455
+ *
2456
+ ******************************************************************************/
2457
+ /**
2458
+ * Partial override for a single default scheduled-task entry keyed by
2459
+ * `taskId`. Every field is optional — only supplied fields replace the
2460
+ * default. Use `enabled: true` to opt a task in without otherwise
2461
+ * changing its shape.
2462
+ *
2463
+ * @see ScheduledTasksConfig
2464
+ * @see ./bundles/scheduled-tasks.ts#DEFAULT_SCHEDULED_TASK_ENTRIES
2465
+ */
2466
+ interface ScheduledTaskOverride {
2467
+ /** Whether the task is emitted to disk. Defaults to the registry entry's value (normally `false`). */
2468
+ readonly enabled?: boolean;
2469
+ /**
2470
+ * Cron expression. Set to `null` to mean manual-only. Default is
2471
+ * manual-only; every configulator default entry ships without a cron.
2472
+ */
2473
+ readonly cron?: string | null;
2474
+ /** Recommended model label surfaced on frontmatter and the rendered table. */
2475
+ readonly recommendedModel?: "opus" | "sonnet" | "haiku";
2476
+ /** One-line description for the rendered table and SKILL.md frontmatter. */
2477
+ readonly description?: string;
2478
+ /**
2479
+ * Exact `type:*` label values (without the `type:` prefix) the
2480
+ * worker should pick up. When set, replaces the default entry's
2481
+ * single `typeLabel` with a multi-type filter (useful for the
2482
+ * routing-bucket `worker-issue` which covers
2483
+ * `feat/fix/chore/refactor/docs/release/hotfix`). Empty array not
2484
+ * allowed; use `undefined` to keep the default.
2485
+ */
2486
+ readonly typeLabels?: ReadonlyArray<string>;
2487
+ /**
2488
+ * Exact phase-label values the worker filters on. When set, takes
2489
+ * precedence over `phasePrefix` (prefix-match is dropped). Empty
2490
+ * array not allowed; use `undefined` to keep the default.
2491
+ */
2492
+ readonly phaseLabels?: ReadonlyArray<string>;
2493
+ }
2494
+ /**
2495
+ * Fully consumer-authored scheduled-task entry. Entries whose `taskId`
2496
+ * collides with a built-in default **replace** the default outright;
2497
+ * entries with a new `taskId` are appended to the registry.
2498
+ *
2499
+ * @see ScheduledTasksConfig
2500
+ */
2501
+ interface ScheduledTaskEntry {
2502
+ /**
2503
+ * Unique task directory name. Emitted under
2504
+ * `<root>/<taskId>/SKILL.md`. Every `taskId` must be unique within
2505
+ * the resolved registry.
2506
+ */
2507
+ readonly taskId: string;
2508
+ /** Target sub-agent name (filename stem under `.claude/agents/`). */
2509
+ readonly agent: string;
2510
+ /** Human-readable agent label for rendered tables / frontmatter. Defaults to `agent`. */
2511
+ readonly agentLabel?: string;
2512
+ /** GitHub `type:*` label value (without the `type:` prefix) that gates which issues this worker picks up. Ignored when `typeLabels` is set. */
2513
+ readonly typeLabel: string;
2514
+ /**
2515
+ * Exact `type:*` label values (without the `type:` prefix) the
2516
+ * worker picks up. When set, replaces the single `typeLabel` with
2517
+ * a multi-type filter (e.g. the routing-bucket `worker-issue`
2518
+ * covers `feat/fix/chore/refactor/docs/release/hotfix`). Empty
2519
+ * array not allowed.
2520
+ */
2521
+ readonly typeLabels?: ReadonlyArray<string>;
2522
+ /** Optional phase-label prefix (e.g. `research:`). When set, the worker filters on both `type:<typeLabel>` and any `<phasePrefix>*` label. Ignored when `phaseLabels` is set. */
2523
+ readonly phasePrefix?: string;
2524
+ /**
2525
+ * Exact phase-label values the worker filters on (e.g.
2526
+ * `["req:write"]` for a writer that only picks up issues whose
2527
+ * phase label is exactly `req:write`). When set, takes precedence
2528
+ * over `phasePrefix`. Empty array not allowed.
2529
+ */
2530
+ readonly phaseLabels?: ReadonlyArray<string>;
2531
+ /** Recommended model label surfaced on frontmatter and the rendered table. */
2532
+ readonly recommendedModel: "opus" | "sonnet" | "haiku";
2533
+ /** Whether the task is emitted to disk. Defaults to `false` — opt-in. */
2534
+ readonly enabled?: boolean;
2535
+ /** Cron expression. Defaults to `null` (manual-only). */
2536
+ readonly cron?: string | null;
2537
+ /** One-line description for the rendered table and SKILL.md frontmatter. */
2538
+ readonly description?: string;
2539
+ }
2540
+ /**
2541
+ * Per-agent scheduled-task configuration consumed by the `orchestrator`
2542
+ * bundle. Drives the per-agent worker layout at
2543
+ * `<root>/<taskId>/SKILL.md` — one task per agent type with its own
2544
+ * label filter, recommended model, and opt-in enablement.
2545
+ *
2546
+ * The pattern mirrors vortex-management's `.claude/scheduled-tasks/`
2547
+ * layout: splitting workers by type lets expensive research agents run
2548
+ * on a different cadence than cheap synthesis agents, and disabling a
2549
+ * whole category is a one-line toggle instead of label surgery.
2550
+ *
2551
+ * Every task ships **disabled by default**. Consumers opt in
2552
+ * explicitly; the generated repo contains no scheduled-task files
2553
+ * unless at least one task is enabled.
2554
+ *
2555
+ * Every field is optional. When the whole config is absent the
2556
+ * scheduled-tasks subsystem is enabled but no task is emitted (every
2557
+ * default is disabled).
2558
+ *
2559
+ * Malformed configs — unknown model value, empty `taskId` / `agent` /
2560
+ * `typeLabel`, duplicate `taskId` inside `tasks`, override referencing
2561
+ * an unknown default `taskId` — fail the build at synth time via
2562
+ * `validateScheduledTasksConfig`.
2563
+ *
2564
+ * @see ScheduledTaskEntry
2565
+ * @see ScheduledTaskOverride
2566
+ * @see ./bundles/scheduled-tasks.ts#resolveScheduledTasks
2567
+ * @see ./bundles/scheduled-tasks.ts#validateScheduledTasksConfig
2568
+ * @see ./bundles/scheduled-tasks.ts#renderScheduledTasksSection
2569
+ */
2570
+ interface ScheduledTasksConfig {
2571
+ /**
2572
+ * Master switch for the scheduled-tasks subsystem. When `false`, no
2573
+ * `<root>/<taskId>/SKILL.md` files are emitted regardless of
2574
+ * individual task overrides. Defaults to `true` — the subsystem is
2575
+ * on, but every default task is still disabled.
2576
+ */
2577
+ readonly enabled?: boolean;
2578
+ /**
2579
+ * Root directory (relative to the repo root) for emitted
2580
+ * scheduled-task files. Each task renders to
2581
+ * `<root>/<taskId>/SKILL.md`.
2582
+ *
2583
+ * Must be a non-empty relative path (no leading `/`). Defaults to
2584
+ * `.claude/scheduled-tasks`.
2585
+ */
2586
+ readonly root?: string;
2587
+ /**
2588
+ * Per-task overrides keyed by the built-in `taskId`. Use this to
2589
+ * flip the `enabled` toggle on one or more default tasks, override
2590
+ * the cron expression, or change the recommended model without
2591
+ * re-declaring the rest of the entry.
2592
+ *
2593
+ * Every key must match a built-in default `taskId`; unknown keys
2594
+ * fail the build. Use `tasks` to append new entries.
2595
+ */
2596
+ readonly overrides?: Readonly<Record<string, ScheduledTaskOverride>>;
2597
+ /**
2598
+ * Fully consumer-authored task entries. Entries whose `taskId`
2599
+ * matches a built-in default **replace** the default wholesale;
2600
+ * entries with a new `taskId` are appended.
2601
+ *
2602
+ * Every `taskId` must be unique within this list (duplicate
2603
+ * `taskId`s inside `tasks` fail the build). Use `overrides` to
2604
+ * tweak a single field without re-declaring the rest of the entry.
2605
+ */
2606
+ readonly tasks?: ReadonlyArray<ScheduledTaskEntry>;
2607
+ }
2608
+ /*******************************************************************************
2609
+ *
2610
+ * AgentConfig Options
2611
+ *
2612
+ ******************************************************************************/
2613
+ /**
2614
+ * Options for the AgentConfig component.
2615
+ */
2616
+ interface AgentConfigOptions {
2617
+ /**
2618
+ * Target platforms to generate configuration for.
2619
+ * @default [AGENT_PLATFORM.CURSOR, AGENT_PLATFORM.CLAUDE]
2620
+ */
2621
+ readonly platforms?: ReadonlyArray<AgentPlatform>;
2622
+ /**
2623
+ * Additional agent rules to generate alongside auto-detected and bundled rules.
2624
+ * Custom rules override bundled rules of the same name.
2625
+ */
2626
+ readonly rules?: ReadonlyArray<AgentRule>;
2627
+ /**
2628
+ * Additional skills to generate.
2629
+ */
2630
+ readonly skills?: ReadonlyArray<AgentSkill>;
2631
+ /**
2632
+ * Custom sub-agent definitions.
2633
+ */
2634
+ readonly subAgents?: ReadonlyArray<AgentSubAgent>;
2635
+ /**
2636
+ * Custom procedure definitions (executable shell scripts).
2637
+ */
2638
+ readonly procedures?: ReadonlyArray<AgentProcedure>;
2639
+ /**
2640
+ * MCP server configurations. Cross-platform — rendered to the appropriate
2641
+ * config file for each platform.
2642
+ */
2643
+ readonly mcpServers?: Readonly<Record<string, McpServerConfig>>;
2644
+ /**
2645
+ * Whether to automatically detect and include context-aware rule bundles
2646
+ * based on project introspection.
2647
+ * @default true
2648
+ */
2649
+ readonly autoDetectBundles?: boolean;
2650
+ /**
2651
+ * Explicit list of bundle names to include, regardless of auto-detection.
2652
+ * @example ['vitest', 'aws-cdk']
2653
+ */
2654
+ readonly includeBundles?: ReadonlyArray<string>;
2655
+ /**
2656
+ * Bundle names to exclude even if auto-detection would include them.
2657
+ * @example ['jest']
2658
+ */
2659
+ readonly excludeBundles?: ReadonlyArray<string>;
2660
+ /**
2661
+ * Whether to include the base rule set (project-overview, general conventions).
2662
+ * @default true
2663
+ */
2664
+ readonly includeBaseRules?: boolean;
2665
+ /**
2666
+ * Names of individual rules to exclude from any source.
2667
+ */
2668
+ readonly excludeRules?: ReadonlyArray<string>;
2669
+ /**
2670
+ * Additional content to append to existing rules (from bundles or custom rules).
2671
+ * Keys are rule names, values are markdown content appended after a horizontal rule.
2672
+ * Use this to supplement bundle rules with project-specific additions without
2673
+ * replacing the entire rule.
2674
+ *
2675
+ * @example
2676
+ * ```ts
2677
+ * ruleExtensions: {
2678
+ * 'typescript-conventions': '## Additional Conventions\n\n- Use branded types for IDs',
2679
+ * }
2680
+ * ```
2681
+ */
2682
+ readonly ruleExtensions?: Readonly<Record<string, string>>;
2683
+ /**
2684
+ * Claude Code settings.json configuration.
2685
+ * Generated to .claude/settings.json (committed, team-shared).
2686
+ */
2687
+ readonly claudeSettings?: ClaudeSettingsConfig;
2688
+ /**
2689
+ * Cursor-specific configuration. Generates .cursor/hooks.json for
2690
+ * lifecycle hooks and .cursorignore / .cursorindexingignore for
2691
+ * file visibility control.
2692
+ */
2693
+ readonly cursorSettings?: CursorSettingsConfig;
2694
+ /**
2695
+ * Overrides for the output-path roots used by agent bundles
2696
+ * (requirements, BCM, profiles, meetings, research). Unset fields
2697
+ * fall back to the defaults captured in
2698
+ * `bundles/paths.ts#DEFAULT_AGENT_PATHS`.
2699
+ *
2700
+ * This option is the first of the Group A framework injection
2701
+ * points from epic #414. Per-project propagation of these values
2702
+ * into bundle rule content lands in a follow-up — setting it today
2703
+ * does not yet alter generated rules.
2704
+ */
2705
+ readonly paths?: AgentPathsConfig;
2706
+ /**
2707
+ * Project-specific priority-detection rules. Each rule declares a
2708
+ * match predicate (labels, title regex, body regex, or explicit
2709
+ * issue numbers) and a target `priority:*` tier.
2710
+ *
2711
+ * When non-empty, the `base` bundle renders a "Project-specific
2712
+ * priority rules" subsection into the `issue-label-conventions`
2713
+ * rule. Precedence is **first match wins**; the bundle's default
2714
+ * inference heuristics act as the fallback when no rule matches.
2715
+ *
2716
+ * @see PriorityRule
2717
+ * @see ./bundles/priority-rules.ts#renderPriorityRulesSection
2718
+ */
2719
+ readonly priorityRules?: ReadonlyArray<PriorityRule>;
2720
+ /**
2721
+ * Focus-scoring configuration. Declares the path to the consuming
2722
+ * repo's `focus.json` file, score thresholds, and the
2723
+ * agent-expansion rules that govern what agents may append to the
2724
+ * file.
2725
+ *
2726
+ * When set, the `base` bundle appends a "Focus scoring"
2727
+ * subsection to the `issue-label-conventions` rule that teaches
2728
+ * agents (a) how to read `focus.json`, (b) how focus weight
2729
+ * interacts with the `priority:*` taxonomy, and (c) the
2730
+ * agent-driven expansion contract. The actual `focus.json` file
2731
+ * is authored and curated in the consuming repo — configulator
2732
+ * ships the schema and agent instructions only.
2733
+ *
2734
+ * @see FocusConfig
2735
+ * @see FocusArea
2736
+ * @see AgentExpansionRules
2737
+ * @see ./bundles/focus.ts#renderFocusSection
2738
+ */
2739
+ readonly focus?: FocusConfig;
2740
+ /**
2741
+ * Meeting-analysis injection points — typed configs the
2742
+ * `meeting-analysis` bundle consults when classifying, routing, and
2743
+ * templating meetings. Supplies the meeting-type taxonomy, the
2744
+ * area → doc-root routing map, and the agenda-template root used
2745
+ * by the (future) `agenda` bundle.
2746
+ *
2747
+ * When `meetingTypes` is non-empty, the `meeting-analysis` bundle
2748
+ * appends a "Recognized meeting types" subsection to the
2749
+ * `meeting-processing-workflow` rule. When `meetingAreas` is
2750
+ * non-empty, it appends an "Area → doc-root mapping" subsection.
2751
+ * When both are empty or unset, the generated rule content is
2752
+ * unchanged from the no-config baseline.
2753
+ *
2754
+ * @see MeetingsConfig
2755
+ * @see MeetingType
2756
+ * @see MeetingArea
2757
+ * @see ./bundles/meeting-types.ts#renderMeetingTypesSection
2758
+ */
2759
+ readonly meetings?: MeetingsConfig;
2760
+ /**
2761
+ * Framework injection points for source-tier customization and
2762
+ * custom doc sections.
2763
+ *
2764
+ * - `sourceTierExamples` — domain-specific examples injected under
2765
+ * T1 / T2 / T3 / T4 in the base bundle's "Source Quality &
2766
+ * Verification" rule.
2767
+ * - `customDocSections` — consumer-supplied section templates that
2768
+ * render verbatim after an existing section heading in a target
2769
+ * bundle's rule content.
2770
+ *
2771
+ * Named feature toggles (`consortium-model`, `stealth-mode`, etc.)
2772
+ * are intentionally out of scope here — build those on top of
2773
+ * `customDocSections` inside the consuming repo's projen config.
2774
+ *
2775
+ * @see AgentFeaturesConfig
2776
+ * @see SourceTierExamples
2777
+ * @see CustomDocSection
2778
+ * @see ./bundles/features.ts
2779
+ */
2780
+ readonly features?: AgentFeaturesConfig;
2781
+ /**
2782
+ * Funnel-tier configuration consumed by the `orchestrator` bundle.
2783
+ * Drives the multi-key dispatch sort (priority desc → tier asc →
2784
+ * issue number asc) that keeps research feeders from starving.
2785
+ *
2786
+ * When the whole config is omitted the orchestrator ships its
2787
+ * built-in default tier table. Supply `customTypes` to register
2788
+ * additional agent types or override the tier of an existing entry;
2789
+ * supply `tiers` to replace the default list wholesale.
2790
+ *
2791
+ * Malformed configs — tier outside 0–4, empty `type`, duplicate
2792
+ * entries inside a single list — fail the build at synth time via
2793
+ * the orchestrator bundle's tier validator.
2794
+ *
2795
+ * @see AgentTierConfig
2796
+ * @see AgentTierEntry
2797
+ * @see ./bundles/tiers.ts#resolveAgentTiers
2798
+ * @see ./bundles/tiers.ts#validateAgentTierConfig
2799
+ */
2800
+ readonly tiers?: AgentTierConfig;
2801
+ /**
2802
+ * Scope-gate configuration consumed by the `orchestrator` bundle.
2803
+ * Rejects oversized issues at dispatch and instructs the orchestrator
2804
+ * to decompose them into phased sub-issues instead of claiming a
2805
+ * worker session for a multi-hour task.
2806
+ *
2807
+ * When the whole config is omitted, the orchestrator ships with
2808
+ * openhi's published defaults baked in (small: ≤3 AC + ≤2 sources;
2809
+ * medium: ≤6 AC + ≤5 sources; auto-file off).
2810
+ *
2811
+ * Supply `acceptanceCriteria` / `sources` to override the
2812
+ * per-axis thresholds, `decompositionTemplate` to customize the
2813
+ * proposal comment body, or `autoFile: true` to have the
2814
+ * orchestrator file the proposed sub-issues automatically.
2815
+ *
2816
+ * Malformed configs — negative or non-integer thresholds, or
2817
+ * `mediumMax <= smallMax` — fail the build at synth time via
2818
+ * `validateScopeGateConfig`.
2819
+ *
2820
+ * @see ScopeGateConfig
2821
+ * @see ScopeGateThresholds
2822
+ * @see ./bundles/scope-gate.ts#resolveScopeGate
2823
+ * @see ./bundles/scope-gate.ts#validateScopeGateConfig
2824
+ */
2825
+ readonly scopeGate?: ScopeGateConfig;
2826
+ /**
2827
+ * Run-ratio configuration consumed by the `orchestrator` bundle.
2828
+ * Drives the dispatch-to-housekeeping cadence — every `(ratio + 1)`th
2829
+ * run batches PR review + maintenance scan instead of dispatching
2830
+ * fresh issue work, preventing review and maintenance backlog drift
2831
+ * on always-on agent pipelines.
2832
+ *
2833
+ * When the whole config is omitted, the orchestrator ships with
2834
+ * openhi's published 4:1 defaults (four dispatch runs, one
2835
+ * housekeeping run, state file at
2836
+ * `.claude/state/orchestrator-runs.json`, `opus` / `sonnet`
2837
+ * recommended models).
2838
+ *
2839
+ * Supply `ratio` to change the cadence, `stateFilePath` to move
2840
+ * the counter file, `dispatchModel` / `housekeepingModel` to
2841
+ * override the recommended-model labels rendered into the
2842
+ * orchestrator-conventions rule, or `enabled: false` to disable
2843
+ * run-ratio batching entirely.
2844
+ *
2845
+ * Malformed configs — non-integer or non-positive `ratio`, empty
2846
+ * or absolute `stateFilePath` — fail the build at synth time via
2847
+ * `validateRunRatioConfig`.
2848
+ *
2849
+ * @see RunRatioConfig
2850
+ * @see ./bundles/run-ratio.ts#resolveRunRatio
2851
+ * @see ./bundles/run-ratio.ts#validateRunRatioConfig
2852
+ */
2853
+ readonly runRatio?: RunRatioConfig;
2854
+ /**
2855
+ * Pre-flight PR merge configuration consumed by the `orchestrator`
2856
+ * bundle. Drives the pre-flight sweep (vortex step 0b) that merges
2857
+ * eligible PRs before the triage walk reads dependency state,
2858
+ * preventing stale-dependency thrashing on always-on pipelines.
2859
+ *
2860
+ * When the whole config is omitted, the orchestrator ships with
2861
+ * vortex's published defaults (pre-flight enabled, delegated to
2862
+ * the `pr-reviewer` sub-agent, squash merges, linked-issue
2863
+ * keyword required).
2864
+ *
2865
+ * Supply `enabled: false` to disable pre-flight entirely,
2866
+ * `delegateToPrReviewer: false` to merge inline without delegation,
2867
+ * `mergeMethod` to switch to merge-commit or rebase strategies,
2868
+ * `requireLinkedIssue: false` to include PRs without a
2869
+ * `Closes/Fixes/Resolves` keyword, or `eligibleLabels` to gate
2870
+ * pre-flight on consumer-declared opt-in labels.
2871
+ *
2872
+ * Malformed configs — unknown `mergeMethod`, empty /
2873
+ * whitespace-only `eligibleLabels` entries — fail the build at
2874
+ * synth time via `validatePreflightPrConfig`.
2875
+ *
2876
+ * @see PreflightPrConfig
2877
+ * @see ./bundles/preflight-pr.ts#resolvePreflightPr
2878
+ * @see ./bundles/preflight-pr.ts#validatePreflightPrConfig
2879
+ */
2880
+ readonly preflightPr?: PreflightPrConfig;
2881
+ /**
2882
+ * Scheduled-tasks configuration consumed by the `orchestrator`
2883
+ * bundle. Drives the per-agent worker layout at
2884
+ * `<root>/<taskId>/SKILL.md` — one task per agent type with its own
2885
+ * label filter, recommended model, and opt-in enablement.
2886
+ *
2887
+ * Every default task is **disabled by default**. Consumers opt in
2888
+ * explicitly via `overrides.<taskId>.enabled = true`; the generated
2889
+ * repo contains no scheduled-task files until at least one task is
2890
+ * enabled.
2891
+ *
2892
+ * Supply `overrides` to flip `enabled`, cron, or model on a default
2893
+ * task; supply `tasks` to add new entries or replace defaults
2894
+ * wholesale; supply `root` to change the output directory; supply
2895
+ * `enabled: false` on the whole config to disable the subsystem
2896
+ * regardless of individual overrides.
2897
+ *
2898
+ * Malformed configs — unknown model, empty `taskId` / `agent` /
2899
+ * `typeLabel`, duplicate `taskId` in `tasks`, override referencing
2900
+ * an unknown default `taskId` — fail the build at synth time via
2901
+ * `validateScheduledTasksConfig`.
2902
+ *
2903
+ * @see ScheduledTasksConfig
2904
+ * @see ScheduledTaskEntry
2905
+ * @see ScheduledTaskOverride
2906
+ * @see ./bundles/scheduled-tasks.ts#resolveScheduledTasks
2907
+ * @see ./bundles/scheduled-tasks.ts#validateScheduledTasksConfig
2908
+ */
2909
+ readonly scheduledTasks?: ScheduledTasksConfig;
2910
+ /**
2911
+ * Agent-driven unblocking configuration consumed by the
2912
+ * `orchestrator` bundle. Controls the targeted sweep agents run
2913
+ * after applying `status:done` — the sweep flips downstream
2914
+ * `Depends on: #<just-closed>` issues from `status:blocked` to
2915
+ * `status:ready` without waiting for the next orchestrator
2916
+ * dispatch cycle.
2917
+ *
2918
+ * When the whole config is omitted, the orchestrator ships with
2919
+ * the sweep **enabled** and a generic citation comment.
2920
+ *
2921
+ * Supply `enabled: false` to disable the sweep entirely,
2922
+ * `commentTemplate` to override the unblock citation, or
2923
+ * `flagPartialUnblockWithAttention: true` to have the sweep post a
2924
+ * progress comment on dependents whose dependency list is not yet
2925
+ * fully resolved.
2926
+ *
2927
+ * Malformed configs — empty / whitespace-only `commentTemplate` or
2928
+ * `partialUnblockCommentTemplate` — fail the build at synth time
2929
+ * via `validateUnblockDependentsConfig`.
2930
+ *
2931
+ * @see UnblockDependentsConfig
2932
+ * @see ./bundles/unblock-dependents.ts#resolveUnblockDependents
2933
+ * @see ./bundles/unblock-dependents.ts#validateUnblockDependentsConfig
2934
+ */
2935
+ readonly unblockDependents?: UnblockDependentsConfig;
2936
+ /**
2937
+ * Progress-file convention consumed by the `base` bundle and every
2938
+ * phased-agent bundle (bcm-writer, research-pipeline, etc.). Every
2939
+ * phased agent writes a small progress file when it claims an
2940
+ * issue, updates it after each non-trivial step, and deletes it in
2941
+ * the final commit that closes the issue. Crashed sessions are
2942
+ * resumed by reading the file rather than starting over.
2943
+ *
2944
+ * When the whole config is omitted, the convention ships
2945
+ * **enabled** with JSON-formatted files stored under
2946
+ * `.claude/state/<issue-number>-progress.json` and a 72-hour
2947
+ * staleness threshold.
2948
+ *
2949
+ * Supply `enabled: false` to disable the convention entirely,
2950
+ * `format: "markdown"` to use the openhi-style markdown body,
2951
+ * `stateDir` / `filenamePattern` to move or rename the on-disk
2952
+ * artefact, `cleanupOnComplete: false` to retain progress files
2953
+ * after the issue closes, or `staleAfterHours` to override the
2954
+ * stale-branch threshold rendered into the documentation.
2955
+ *
2956
+ * Malformed configs — empty / whitespace-only or absolute
2957
+ * `stateDir`, empty / whitespace-only `filenamePattern`,
2958
+ * `filenamePattern` missing the `<ISSUE_NUMBER>` placeholder,
2959
+ * unknown `format`, non-positive `staleAfterHours` — fail the
2960
+ * build at synth time via `validateProgressFilesConfig`.
2961
+ *
2962
+ * @see ProgressFilesConfig
2963
+ * @see ./bundles/progress-files.ts#resolveProgressFiles
2964
+ * @see ./bundles/progress-files.ts#validateProgressFilesConfig
2965
+ * @see ./bundles/progress-files.ts#renderProgressFilesRuleContent
2966
+ */
2967
+ readonly progressFiles?: ProgressFilesConfig;
2968
+ /**
2969
+ * Shared-editing safety convention consumed by the `base` bundle
2970
+ * and every phased-agent bundle that writes rows to a shared
2971
+ * registry or feature-matrix file. Documents the single-entry /
2972
+ * deterministic-sort / verify-commit / re-sort-on-conflict protocol
2973
+ * agents follow when touching an index file other sessions may also
2974
+ * be editing concurrently.
2975
+ *
2976
+ * When the whole config is omitted, the convention ships
2977
+ * **enabled** with the documented default set of shared-index path
2978
+ * patterns, commit-path verification on, and the `rebase` conflict
2979
+ * strategy.
2980
+ *
2981
+ * Supply `enabled: false` to disable the convention entirely,
2982
+ * `sharedIndexPaths` to replace the default pattern list,
2983
+ * `verifyCommit: false` to drop the commit-path verification
2984
+ * protocol from the rendered rule, `conflictStrategy: "merge"` to
2985
+ * switch the conflict recipe to the merge-commit flow, or
2986
+ * `emitHelper: true` to ship the
2987
+ * `.claude/procedures/verify-index-row.sh` helper script to disk.
2988
+ *
2989
+ * Malformed configs — empty `sharedIndexPaths`, empty /
2990
+ * whitespace-only path entry, unknown `conflictStrategy` — fail
2991
+ * the build at synth time via `validateSharedEditingConfig`.
2992
+ *
2993
+ * @see SharedEditingConfig
2994
+ * @see ./bundles/shared-editing.ts#resolveSharedEditing
2995
+ * @see ./bundles/shared-editing.ts#validateSharedEditingConfig
2996
+ * @see ./bundles/shared-editing.ts#renderSharedEditingRuleContent
2997
+ */
2998
+ readonly sharedEditing?: SharedEditingConfig;
2999
+ /**
3000
+ * Skill eval harness convention consumed by the `base` bundle and
3001
+ * every skill-owning bundle. Each skill under
3002
+ * `<skillsRoot>/<skill-name>/` may ship a regression suite at
3003
+ * `<skillsRoot>/<skill-name>/evals/evals.json`. Suites are
3004
+ * declarative prompt / expected-output fixtures parameterised by a
3005
+ * shared product-context fixture so the same eval shape works
3006
+ * across every project that depends on configulator.
3007
+ *
3008
+ * When the whole config is omitted, the convention ships
3009
+ * **enabled** with skills-root `.claude/skills`, product-context
3010
+ * fixture `docs/src/content/docs/project-context.md`,
3011
+ * product-context required, and the runner helper opt-in.
3012
+ *
3013
+ * Supply `enabled: false` to disable the convention entirely,
3014
+ * `skillsRoot` or `productContextPath` to override the default
3015
+ * paths, `requireProductContext: false` to downgrade missing
3016
+ * product-context to a warning, or `emitRunner: true` to ship the
3017
+ * `.claude/procedures/run-skill-evals.sh` helper to disk.
3018
+ *
3019
+ * Malformed configs — empty / whitespace-only or absolute
3020
+ * `skillsRoot`, empty / whitespace-only or absolute
3021
+ * `productContextPath` — fail the build at synth time via
3022
+ * `validateSkillEvalsConfig`.
3023
+ *
3024
+ * @see SkillEvalsConfig
3025
+ * @see ./bundles/skill-evals.ts#resolveSkillEvals
3026
+ * @see ./bundles/skill-evals.ts#validateSkillEvalsConfig
3027
+ * @see ./bundles/skill-evals.ts#renderSkillEvalsRuleContent
3028
+ */
3029
+ readonly skillEvals?: SkillEvalsConfig;
3030
+ /**
3031
+ * Workflow-diagrams convention consumed by the `base` bundle and
3032
+ * every phased-agent bundle. Documents the single hand-authored
3033
+ * Mermaid-based diagrams page that visualises every agent's phase
3034
+ * graph and every cross-agent handoff, and enforces the
3035
+ * diagram-touched-when-bundle-touched rule: a change set that
3036
+ * modifies a bundle's phase graph must also update the matching
3037
+ * section in the diagrams page.
3038
+ *
3039
+ * When the whole config is omitted, the convention ships
3040
+ * **enabled** with the default diagrams path
3041
+ * (`docs/src/content/docs/agents/workflows.md`), the default
3042
+ * bundle-path patterns, the hard-requirement phrasing, and both
3043
+ * the starter page and the checker script opt-in.
3044
+ *
3045
+ * Supply `enabled: false` to disable the convention entirely,
3046
+ * `diagramsPath` to move the page, `bundlePathPatterns` to
3047
+ * replace the default pattern list, `emitStarterDiagram: true`
3048
+ * to seed a minimal starter page on disk, `emitChecker: true` to
3049
+ * ship the `.claude/procedures/check-workflow-diagrams.sh`
3050
+ * helper, or `requireDiagramUpdate: false` to soften the rule
3051
+ * phrasing from MUST to SHOULD.
3052
+ *
3053
+ * Malformed configs — empty / whitespace-only or absolute
3054
+ * `diagramsPath`, empty `bundlePathPatterns`, empty /
3055
+ * whitespace-only pattern entry — fail the build at synth time
3056
+ * via `validateWorkflowDiagramsConfig`.
3057
+ *
3058
+ * @see WorkflowDiagramsConfig
3059
+ * @see ./bundles/workflow-diagrams.ts#resolveWorkflowDiagrams
3060
+ * @see ./bundles/workflow-diagrams.ts#validateWorkflowDiagramsConfig
3061
+ * @see ./bundles/workflow-diagrams.ts#renderWorkflowDiagramsRuleContent
3062
+ */
3063
+ readonly workflowDiagrams?: WorkflowDiagramsConfig;
3064
+ /**
3065
+ * Issue-templates convention consumed by the `base` bundle and
3066
+ * every phased-agent bundle that files downstream issues.
3067
+ * Documents the single hand-authored reference page that carries
3068
+ * one canonical `gh issue create` recipe per downstream phase
3069
+ * label, and enforces the reference-don't-inline rule: bundle
3070
+ * rules and agent prompts cite the matching section of that page
3071
+ * instead of duplicating a full `gh issue create` invocation.
3072
+ *
3073
+ * When the whole config is omitted, the convention ships
3074
+ * **enabled** with the default templates path
3075
+ * (`docs/src/content/docs/agents/issue-templates.md`), the default
3076
+ * bundle-path patterns, the hard-requirement phrasing, and both
3077
+ * the starter page and the lint script opt-in.
3078
+ *
3079
+ * Supply `enabled: false` to disable the convention entirely,
3080
+ * `templatesPath` to move the page, `bundlePathPatterns` to
3081
+ * replace the default pattern list, `emitStarterDoc: true` to
3082
+ * seed a minimal starter page on disk, `emitChecker: true` to
3083
+ * ship the `.claude/procedures/check-issue-templates.sh` helper,
3084
+ * or `requireReference: false` to soften the rule phrasing from
3085
+ * MUST to SHOULD.
3086
+ *
3087
+ * Malformed configs — empty / whitespace-only or absolute
3088
+ * `templatesPath`, empty `bundlePathPatterns`, empty /
3089
+ * whitespace-only pattern entry — fail the build at synth time
3090
+ * via `validateIssueTemplatesConfig`.
3091
+ *
3092
+ * @see IssueTemplatesConfig
3093
+ * @see ./bundles/issue-templates.ts#resolveIssueTemplates
3094
+ * @see ./bundles/issue-templates.ts#validateIssueTemplatesConfig
3095
+ * @see ./bundles/issue-templates.ts#renderIssueTemplatesRuleContent
3096
+ */
3097
+ readonly issueTemplates?: IssueTemplatesConfig;
3098
+ }
3099
+
3100
+ /**
3101
+ * Generates AI coding assistant configuration files from a common schema.
3102
+ *
3103
+ * Supports Cursor and Claude Code (initial release), with Codex and Copilot
3104
+ * renderers planned for future issues. Rules, skills, and sub-agents are
3105
+ * defined once and rendered into the correct format for each target platform.
3106
+ *
3107
+ * Follows the configulator component pattern: extends Component, static .of()
3108
+ * factory, options interface with JSDoc.
3109
+ *
3110
+ * @example
3111
+ * ```ts
3112
+ * new AgentConfig(project, {
3113
+ * rules: [{
3114
+ * name: 'my-rule',
3115
+ * description: 'Project conventions',
3116
+ * scope: AGENT_RULE_SCOPE.ALWAYS,
3117
+ * content: '# My Rule\n\nFollow these conventions...',
3118
+ * }],
3119
+ * });
3120
+ * ```
3121
+ */
3122
+ declare class AgentConfig extends Component {
3123
+ /**
3124
+ * Find the AgentConfig component on a project.
3125
+ */
3126
+ static of(project: Project$1): AgentConfig | undefined;
3127
+ /**
3128
+ * Returns `true` when at least one tier array on the supplied
3129
+ * `SourceTierExamples` is non-empty, signalling that the consuming
3130
+ * repo has opted into rendering the base bundle's
3131
+ * `source-quality-verification` rule. Returns `false` for
3132
+ * `undefined`, `{}`, or a fully-empty `{ t1: [], t2: [], t3: [], t4: [] }`.
3133
+ */
3134
+ private static hasActiveTierExamples;
3135
+ /**
3136
+ * Merges default Claude permissions with bundle and user-supplied settings.
3137
+ *
3138
+ * Merge order: defaults → bundle permissions → user-supplied entries.
3139
+ * `defaultMode` defaults to `"dontAsk"` unless overridden.
3140
+ */
3141
+ private static mergeClaudeDefaults;
3142
+ private readonly options;
3143
+ private cachedBundles?;
3144
+ private cachedPaths?;
3145
+ constructor(project: Project$1, options?: AgentConfigOptions);
3146
+ /**
3147
+ * Resolved agent-path roots for this project. Consumer overrides on
3148
+ * `AgentConfigOptions.paths` cascade into derived roots via
3149
+ * `resolveAgentPaths()`. Memoized so repeated reads during synthesis
3150
+ * do not re-run the resolver.
3151
+ */
3152
+ private get resolvedPaths();
3153
+ /**
3154
+ * Path-aware built-in bundles assembled with this project's
3155
+ * resolved paths. Path-aware bundle factories (e.g.
3156
+ * `buildResearchPipelineBundle`) receive the resolved struct so
3157
+ * their rendered rule content reflects any consumer override.
3158
+ * Bundles that do not read agent paths are passed through as-is
3159
+ * from their default const exports.
3160
+ */
3161
+ private get pathAwareBundles();
3162
+ /**
3163
+ * Returns the bundles that are active for this project: auto-detected
3164
+ * bundles (when `autoDetectBundles !== false`) plus force-included
3165
+ * bundles, minus explicitly excluded bundles. Deduplicated by name.
3166
+ *
3167
+ * Exposed so sibling components (e.g. the sync-labels workflow) can
3168
+ * consume bundle-contributed configuration.
3169
+ */
3170
+ get activeBundles(): ReadonlyArray<AgentRuleBundle>;
3171
+ preSynthesize(): void;
3172
+ private resolvePlatforms;
3173
+ private resolveRules;
1693
3174
  /**
1694
3175
  * Return a bundle's rules with `filePatterns` narrowed to the projects
1695
3176
  * that actually matched the bundle's detection predicate (when the bundle
@@ -1699,253 +3180,1479 @@ declare class AgentConfig extends Component {
1699
3180
  * implement the hook are returned with only the custom-section
1700
3181
  * transformation (if any) applied.
1701
3182
  */
1702
- private bundleRulesFor;
1703
- private resolveSkills;
1704
- private resolveSubAgents;
1705
- private resolveProcedures;
3183
+ private bundleRulesFor;
3184
+ private resolveSkills;
3185
+ private resolveSubAgents;
3186
+ private resolveProcedures;
3187
+ /**
3188
+ * Resolves template variables in rule content using project metadata.
3189
+ * Emits synthesis warnings for rules with unresolved variables.
3190
+ */
3191
+ private resolveTemplates;
3192
+ /**
3193
+ * Resolves template variables in skill instructions using project metadata.
3194
+ */
3195
+ private resolveSkillTemplates;
3196
+ /**
3197
+ * Resolves template variables in sub-agent prompts using project metadata.
3198
+ */
3199
+ private resolveSubAgentTemplates;
3200
+ /**
3201
+ * Resolves template variables in procedure content using project metadata.
3202
+ */
3203
+ private resolveProcedureTemplates;
3204
+ /**
3205
+ * Collects Claude permission entries from all active bundles.
3206
+ */
3207
+ private resolveBundlePermissions;
3208
+ }
3209
+
3210
+ /**
3211
+ * Fully-resolved agent output-path roots. Every property is required.
3212
+ *
3213
+ * This is the shape that bundle code consumes at module-eval time via
3214
+ * `DEFAULT_AGENT_PATHS`, and the shape that `resolveAgentPaths()`
3215
+ * returns when consumers supply a partial `AgentPathsConfig` override.
3216
+ */
3217
+ interface ResolvedAgentPaths {
3218
+ readonly docsRoot: string;
3219
+ readonly researchRoot: string;
3220
+ readonly profilesRoot: string;
3221
+ readonly meetingsRoot: string;
3222
+ readonly requirementsRoot: string;
3223
+ readonly researchRequirementsRoot: string;
3224
+ readonly bcmRoot: string;
3225
+ readonly peopleRoot: string;
3226
+ readonly companiesRoot: string;
3227
+ readonly softwareRoot: string;
3228
+ readonly industriesRoot: string;
3229
+ }
3230
+ /**
3231
+ * Canonical default values for every agent path. These mirror the
3232
+ * hardcoded paths that bundles used before `AgentPathsConfig` existed,
3233
+ * so `DEFAULT_AGENT_PATHS.*` can be substituted into bundle rule
3234
+ * content at module-eval time without changing the generated
3235
+ * `.claude/rules/*.md` snapshot.
3236
+ *
3237
+ * Consumers override the defaults by passing an `AgentPathsConfig`
3238
+ * through `AgentConfigOptions.paths` and resolving it with
3239
+ * `resolveAgentPaths()`. Per-project propagation into bundle rule
3240
+ * content is a follow-up — this export is the first step: interface +
3241
+ * resolver land in this PR; the `AgentConfig.resolveRules` wiring lands
3242
+ * next.
3243
+ */
3244
+ declare const DEFAULT_AGENT_PATHS: ResolvedAgentPaths;
3245
+ /**
3246
+ * Resolve a partial `AgentPathsConfig` into a fully-populated
3247
+ * `ResolvedAgentPaths`. Unset fields cascade from their parent root:
3248
+ *
3249
+ * - `profilesRoot`, `meetingsRoot`, `requirementsRoot`, and `bcmRoot`
3250
+ * derive from `docsRoot` when not explicitly set.
3251
+ * - `researchRequirementsRoot` derives from `researchRoot` when not
3252
+ * explicitly set.
3253
+ * - `peopleRoot`, `companiesRoot`, `softwareRoot`, and `industriesRoot`
3254
+ * derive from the resolved `profilesRoot` when not explicitly set,
3255
+ * so that overriding `docsRoot` alone (or overriding `profilesRoot`
3256
+ * alone) propagates correctly through every dependent root.
3257
+ */
3258
+ declare function resolveAgentPaths(paths?: AgentPathsConfig): ResolvedAgentPaths;
3259
+
3260
+ /**
3261
+ * Agenda bundle — enabled by default.
3262
+ *
3263
+ * Consuming projects can disable it with
3264
+ * `excludeBundles: ["agenda"]`. `appliesWhen` always returns `true`
3265
+ * (peer-present assumption, same pattern as the other workflow
3266
+ * bundles).
3267
+ *
3268
+ * Provides a 2-phase pre-meeting agenda pipeline
3269
+ * (draft → finalize), complementing the post-meeting pipeline in
3270
+ * the `meeting-analysis` bundle. Ships a sub-agent, two user-
3271
+ * invocable skills (`/draft-agenda`, `/finalize-agenda`), and
3272
+ * `agenda:*` phase labels via the bundle `labels` mechanism so
3273
+ * consuming projects automatically pick up the label taxonomy
3274
+ * through the sync-labels workflow.
3275
+ *
3276
+ * Reuses the meeting-type taxonomy from
3277
+ * `AgentConfigOptions.meetings.meetingTypes` — the same table the
3278
+ * `meeting-analysis` bundle consumes for post-meeting extraction.
3279
+ */
3280
+ declare const agendaBundle: AgentRuleBundle;
3281
+
3282
+ /**
3283
+ * AWS CDK bundle — auto-detected when `aws-cdk-lib` is in dependencies.
3284
+ */
3285
+ declare const awsCdkBundle: AgentRuleBundle;
3286
+
3287
+ /**
3288
+ * Base bundle — always included unless `includeBaseRules: false`.
3289
+ * Contains project-overview, interaction-style, and general-conventions rules.
3290
+ */
3291
+ declare function buildBaseBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
3292
+ /**
3293
+ * Default-paths instance of the base bundle, preserved for backward
3294
+ * compatibility with consumers that import the const directly. The
3295
+ * factory above is the canonical entry point when a consumer supplies
3296
+ * `AgentConfigOptions.paths`.
3297
+ */
3298
+ declare const baseBundle: AgentRuleBundle;
3299
+
3300
+ /**
3301
+ * Build the bcm-writer bundle with the supplied resolved paths.
3302
+ *
3303
+ * Every reference to a canonical agent path (bcm root, docs root, etc.)
3304
+ * inside the rule / skill / sub-agent content strings is an interpolation
3305
+ * of the supplied `paths` struct, so a consumer override of
3306
+ * `AgentConfigOptions.paths` propagates to the rendered output.
3307
+ *
3308
+ * Consuming projects can disable it with `excludeBundles: ["bcm-writer"]`.
3309
+ * `appliesWhen` always returns `true` per this batch's directive that
3310
+ * bundles assume peers are present.
3311
+ *
3312
+ * Ships a single consolidated sub-agent (`bcm-writer`) with all 4 phase
3313
+ * handlers in one prompt (outline, scaffold, context, connect), a
3314
+ * user-invocable skill (`/write-bcm`), and `type:bcm-document` plus
3315
+ * `bcm:*` phase labels.
3316
+ *
3317
+ * The bundle assumes the `people-profile`, `company-profile`, and
3318
+ * `research-pipeline` bundles are also enabled so Phase 4 can hand off
3319
+ * surfaced items via `people:research`, `company:research`, and
3320
+ * `research:scope` issues.
3321
+ */
3322
+ declare function buildBcmWriterBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
3323
+ /**
3324
+ * Default-paths instance of the bcm-writer bundle, preserved for
3325
+ * backward compatibility with consumers that import the const directly.
3326
+ * The factory above is the canonical entry point when a consumer
3327
+ * supplies `AgentConfigOptions.paths`.
3328
+ */
3329
+ declare const bcmWriterBundle: AgentRuleBundle;
3330
+
3331
+ /**
3332
+ * Build the business-models bundle with the supplied resolved paths.
3333
+ *
3334
+ * Every reference to a canonical agent path (docs root, research root,
3335
+ * etc.) inside the rule / skill / sub-agent content strings is an
3336
+ * interpolation of the supplied `paths` struct, so a consumer override
3337
+ * of `AgentConfigOptions.paths` propagates to the rendered output.
3338
+ *
3339
+ * The bundle sits between `industry-discovery` (upstream, selects
3340
+ * verticals) and `bcm-writer` (downstream, models capabilities). It
3341
+ * assumes `bcm-writer` is enabled so Phase 3 can hand off surfaced
3342
+ * capabilities via `bcm:outline` issues, and it is read by
3343
+ * `company-profile` via the shared `<BUSINESS_MODELS_ROOT>` default
3344
+ * path (`<docsRoot>/industry-research/`).
3345
+ */
3346
+ declare function buildBusinessModelsBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
3347
+ /**
3348
+ * Default-paths instance of the business-models bundle, preserved for
3349
+ * backward compatibility with consumers that import the const
3350
+ * directly. The factory above is the canonical entry point when a
3351
+ * consumer supplies `AgentConfigOptions.paths`.
3352
+ */
3353
+ declare const businessModelsBundle: AgentRuleBundle;
3354
+
3355
+ /**
3356
+ * Build the company-profile bundle with the supplied resolved paths.
3357
+ *
3358
+ * Every reference to a canonical agent path (docs root, etc.) inside
3359
+ * the rule / skill / sub-agent content strings is an interpolation of
3360
+ * the supplied `paths` struct, so a consumer override of
3361
+ * `AgentConfigOptions.paths` propagates to the rendered output.
3362
+ *
3363
+ * Ships a sub-agent (`company-profile-analyst`), four user-invocable
3364
+ * skills (`/profile-company`, `/match-company`, `/refresh-company`,
3365
+ * `/analyze-segment`), and `type:company-profile` plus `company:*`
3366
+ * phase labels for the six phases.
3367
+ */
3368
+ declare function buildCompanyProfileBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
3369
+ /**
3370
+ * Default-paths instance of the company-profile bundle, preserved for
3371
+ * backward compatibility with consumers that import the const
3372
+ * directly. The factory above is the canonical entry point when a
3373
+ * consumer supplies `AgentConfigOptions.paths`.
3374
+ */
3375
+ declare const companyProfileBundle: AgentRuleBundle;
3376
+
3377
+ /**
3378
+ * Customer-profile bundle — enabled by default.
3379
+ *
3380
+ * Consuming projects can disable it with
3381
+ * `excludeBundles: ["customer-profile"]`. `appliesWhen` always
3382
+ * returns `true` per the workflow-bundle peer-present assumption.
3383
+ *
3384
+ * Ships a sub-agent (`customer-profile-analyst`), three
3385
+ * user-invocable skills (`/discover-customers`, `/profile-customer`,
3386
+ * `/analyze-customer-competitors`), a customer-profile-page template
3387
+ * (emitted alongside the profile skill), and `type:customer-profile`
3388
+ * plus `customer:*` phase labels.
3389
+ *
3390
+ * The bundle sits downstream of `meeting-analysis`,
3391
+ * `industry-discovery`, and `research-pipeline` (which surface the
3392
+ * need for customer-archetype research) and hands off unmet needs to
3393
+ * the `requirements-analyst` bundle via `req:scan` issues, and
3394
+ * canonical profiles to `company-profile` and `people-profile` for
3395
+ * representative customer organizations, competitor organizations,
3396
+ * and notable contacts.
3397
+ *
3398
+ * Distinct from `company-profile`: the `company-profile` bundle
3399
+ * targets any company entity (competitor, vendor, partner, customer
3400
+ * organization); this bundle targets **customer archetypes** (the
3401
+ * reusable shape of a buyer/user segment) and closes the loop from
3402
+ * unmet need to `req:scan` seed via the shared software-profile
3403
+ * feature matrix.
3404
+ */
3405
+ declare function buildCustomerProfileBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
3406
+ /**
3407
+ * Default-paths instance of the customer-profile bundle, preserved
3408
+ * for backward compatibility with consumers that import the const
3409
+ * directly. The factory above is the canonical entry point when a
3410
+ * consumer supplies `AgentConfigOptions.paths`.
3411
+ */
3412
+ declare const customerProfileBundle: AgentRuleBundle;
3413
+
3414
+ /**
3415
+ * Render the shell body of the `.claude/procedures/extract-api.sh`
3416
+ * helper. Exported so the docs-sync bundle can register it as an
3417
+ * `AgentProcedure` and the bundles test suite can assert on the
3418
+ * script's contents.
3419
+ *
3420
+ * The helper runs `@microsoft/api-extractor` end-to-end for a single
3421
+ * package and writes the `.api.md` rollup to the scratch folder
3422
+ * declared by that package's `api-extractor.json`. Rollups are
3423
+ * **regenerate-on-scan** per the docs-sync epic resolved decision #3
3424
+ * — the scan phase consumes the freshly-regenerated rollup in-memory
3425
+ * rather than comparing against a committed baseline.
3426
+ *
3427
+ * Exit codes: `0` success, `1` usage / missing directory, `2` no
3428
+ * `api-extractor.json` at the target path, `3` the extractor exited
3429
+ * non-zero (compile error or extractor failure).
3430
+ */
3431
+ declare function renderExtractApiProcedure(): string;
3432
+ /**
3433
+ * `AgentProcedure` definition for `.claude/procedures/extract-api.sh`.
3434
+ * Registered on the docs-sync bundle so it ships when the bundle is
3435
+ * force-included — matches the packaging of other bundled procedures
3436
+ * (see `orchestratorBundle.procedures`).
3437
+ */
3438
+ declare const extractApiProcedure: AgentProcedure;
3439
+ /**
3440
+ * Docs-sync bundle — scaffolding release.
3441
+ *
3442
+ * Opt-in via `includeBundles: ["docs-sync"]`. `appliesWhen` returns
3443
+ * `false` by default so the scaffold ships disabled until a
3444
+ * downstream child issue enables it across the monorepo.
3445
+ *
3446
+ * Provides the skeleton of a 2-phase drift-detection + audit pipeline
3447
+ * (scan → fix) designed for monorepos that keep documentation inside
3448
+ * a Starlight singleton. Ships a sub-agent, two user-invocable skills
3449
+ * (`/docs-sync-pr`, `/docs-sync-audit`), five new labels
3450
+ * (`type:docs-sync`, `docs-sync:scan`, `docs-sync:fix`,
3451
+ * `docs-sync:advisory`, `docs-sync:blocking`), and a
3452
+ * `Documentation Sync Workflow` rule rendered into CLAUDE.md so
3453
+ * humans reading the file see the pipeline exists even while the
3454
+ * behavior is still landing across child issues.
3455
+ */
3456
+ declare function buildDocsSyncBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
3457
+ /**
3458
+ * Default-paths instance of the docs-sync bundle, preserved for
3459
+ * parity with other path-aware bundles in this directory. The factory
3460
+ * above is the canonical entry point when a consumer supplies
3461
+ * `AgentConfigOptions.paths`.
3462
+ */
3463
+ declare const docsSyncBundle: AgentRuleBundle;
3464
+
3465
+ /**
3466
+ * GitHub workflow bundle — auto-detected when the project has a GitHub component.
3467
+ */
3468
+ declare const githubWorkflowBundle: AgentRuleBundle;
3469
+
3470
+ /**
3471
+ * Build the industry-discovery bundle with the supplied resolved paths.
3472
+ *
3473
+ * Every reference to a canonical agent path (docs root, etc.) inside
3474
+ * the rule / skill / sub-agent content strings is an interpolation of
3475
+ * the supplied `paths` struct, so a consumer override of
3476
+ * `AgentConfigOptions.paths` propagates to the rendered output.
3477
+ */
3478
+ declare function buildIndustryDiscoveryBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
3479
+ /**
3480
+ * Default-paths instance of the industry-discovery bundle, preserved
3481
+ * for backward compatibility with consumers that import the const
3482
+ * directly. The factory above is the canonical entry point when a
3483
+ * consumer supplies `AgentConfigOptions.paths`.
3484
+ */
3485
+ declare const industryDiscoveryBundle: AgentRuleBundle;
3486
+
3487
+ /**
3488
+ * Jest bundle — auto-detected when Jest is in dependencies.
3489
+ */
3490
+ declare const jestBundle: AgentRuleBundle;
3491
+
3492
+ /**
3493
+ * Maintenance-audit bundle — enabled by default.
3494
+ *
3495
+ * Consuming projects can disable it with
3496
+ * `excludeBundles: ["maintenance-audit"]`. `appliesWhen` always returns
3497
+ * `true` per this batch's directive that bundles assume peers are
3498
+ * present.
3499
+ *
3500
+ * Provides a 3-phase documentation-maintenance pipeline
3501
+ * (scan → fix → verify) designed for any project with structured doc
3502
+ * registries and cross-references. Ships a sub-agent, two user-
3503
+ * invocable skills (`/audit-docs`, `/verify-audit`), and `maint:*`
3504
+ * phase labels via the bundle `labels` mechanism so consuming projects
3505
+ * automatically pick up the label taxonomy through the sync-labels
3506
+ * workflow.
3507
+ */
3508
+ declare function buildMaintenanceAuditBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
3509
+ /**
3510
+ * Default-paths instance of the maintenance-audit bundle, preserved
3511
+ * for backward compatibility with consumers that import the const
3512
+ * directly. The factory above is the canonical entry point when a
3513
+ * consumer supplies `AgentConfigOptions.paths`.
3514
+ */
3515
+ declare const maintenanceAuditBundle: AgentRuleBundle;
3516
+
3517
+ /**
3518
+ * Meeting analysis bundle — included by default.
3519
+ * Provides a 4-phase meeting transcript processing workflow.
3520
+ */
3521
+ declare const meetingAnalysisBundle: AgentRuleBundle;
3522
+
3523
+ /**
3524
+ * Default for whether the orchestrator delegates the pre-flight merge
3525
+ * sweep to the `pr-reviewer` sub-agent. Mirrors vortex's step 0b
3526
+ * contract: invoking the reviewer as a sub-agent lets the merge
3527
+ * workflow run on its own (cheaper) model rather than on the
3528
+ * orchestrator's model. Set to `false` to have the orchestrator merge
3529
+ * eligible PRs inline.
3530
+ *
3531
+ * @see PreflightPrConfig
3532
+ */
3533
+ declare const DEFAULT_DELEGATE_TO_PR_REVIEWER = true;
3534
+ /**
3535
+ * Default merge method used when the orchestrator merges a PR inline
3536
+ * (`delegateToPrReviewer = false`). Squash-and-merge matches every
3537
+ * existing configulator consumer and keeps `main` free of
3538
+ * branch-construction noise.
3539
+ *
3540
+ * @see PreflightPrConfig
3541
+ */
3542
+ declare const DEFAULT_MERGE_METHOD: PreflightMergeMethod;
3543
+ /**
3544
+ * Default for whether pre-flight skips PRs lacking a
3545
+ * `Closes/Fixes/Resolves #<n>` keyword in the body. Most pipelines
3546
+ * require a linked issue, so the safe default is `true` — pre-flight
3547
+ * only merges PRs that cleanly complete a known issue.
3548
+ *
3549
+ * @see PreflightPrConfig
3550
+ */
3551
+ declare const DEFAULT_REQUIRE_LINKED_ISSUE = true;
3552
+ /**
3553
+ * Merge-method values accepted on `PreflightPrConfig.mergeMethod`.
3554
+ * Matches the `gh pr merge` flags: `--squash`, `--merge`, `--rebase`.
3555
+ */
3556
+ declare const PREFLIGHT_MERGE_METHOD_VALUES: readonly ["squash", "merge", "rebase"];
3557
+ type PreflightMergeMethod = (typeof PREFLIGHT_MERGE_METHOD_VALUES)[number];
3558
+ /**
3559
+ * Fully-resolved pre-flight PR merge settings. Every field is defaulted
3560
+ * so downstream renderers can reason about a single canonical shape.
3561
+ */
3562
+ interface ResolvedPreflightPr {
3563
+ readonly enabled: boolean;
3564
+ readonly delegateToPrReviewer: boolean;
3565
+ readonly mergeMethod: PreflightMergeMethod;
3566
+ readonly requireLinkedIssue: boolean;
3567
+ readonly eligibleLabels: ReadonlyArray<string>;
3568
+ }
3569
+ /**
3570
+ * Resolve a (possibly absent) `PreflightPrConfig` into a canonical
3571
+ * `ResolvedPreflightPr` with every field filled in. Unset fields
3572
+ * cascade from their documented defaults.
3573
+ *
3574
+ * Malformed configs (unknown `mergeMethod`, empty or whitespace-only
3575
+ * `eligibleLabels` entry) throw a descriptive `Error` — callers should
3576
+ * not need to guard against it at runtime.
3577
+ */
3578
+ declare function resolvePreflightPr(config?: PreflightPrConfig): ResolvedPreflightPr;
3579
+ /**
3580
+ * Synth-time validation hook. Throws a descriptive `Error` when the
3581
+ * supplied `PreflightPrConfig` is malformed. Called by
3582
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
3583
+ * pre-flight sweep fails the build instead of silently shipping a
3584
+ * broken check-blocked.sh subcommand. Returns the resolved config
3585
+ * unchanged so callers can write
3586
+ * `const pf = validatePreflightPrConfig(config)` in one line.
3587
+ *
3588
+ * Malformed cases rejected here:
3589
+ *
3590
+ * - `mergeMethod` not one of `squash` / `merge` / `rebase`.
3591
+ * - Any `eligibleLabels` entry that is empty or whitespace-only.
3592
+ */
3593
+ declare function validatePreflightPrConfig(config?: PreflightPrConfig): ResolvedPreflightPr;
3594
+ /**
3595
+ * Render the markdown subsection appended to the
3596
+ * `orchestrator-conventions` rule. Always returns a non-empty string so
3597
+ * the orchestrator rule documents the pre-flight contract even when the
3598
+ * consumer relies on the defaults.
3599
+ */
3600
+ declare function renderPreflightPrSection(pf: ResolvedPreflightPr): string;
3601
+ /**
3602
+ * Render a shell-script snippet embedded in `check-blocked.sh`. The
3603
+ * snippet declares a `cmd_preflight()` function that scans open PRs
3604
+ * and echoes one eligibility line per PR in the canonical
3605
+ * `PREFLIGHT_MERGE PR #<n> issue:#<m> branch:<b> — "<title>"` format
3606
+ * (or `PREFLIGHT_SKIP PR #<n> — <reason> — "<title>"` on skip, or
3607
+ * `NO_PREFLIGHT_PRS` when nothing is eligible).
3608
+ *
3609
+ * Returns the body of a shell function block (including the
3610
+ * `cmd_preflight()` wrapper) so the surrounding script can splice it
3611
+ * inline at the exact indent level it wants.
3612
+ */
3613
+ declare function renderPreflightPrShellHelpers(pf: ResolvedPreflightPr): string;
3614
+
3615
+ /**
3616
+ * Default dispatch-to-housekeeping ratio — openhi's `DISPATCHER.md`
3617
+ * ships a 4:1 ratio: four consecutive dispatch runs, then one
3618
+ * housekeeping run, then the counter wraps. The ratio value stored
3619
+ * here is the dispatch-run count per housekeeping run; with
3620
+ * `ratio = 4`, runs 1–4 dispatch and run 5 housekeeps. The cycle
3621
+ * length is therefore `ratio + 1`.
3622
+ *
3623
+ * @see RunRatioConfig
3624
+ */
3625
+ declare const DEFAULT_DISPATCH_TO_HOUSEKEEPING_RATIO = 4;
3626
+ /**
3627
+ * Default on-disk path for the orchestrator run-counter state file,
3628
+ * relative to the repo root. The file is tiny JSON
3629
+ * (`{ "run_counter": <n> }`) and is gitignored in most consumer repos
3630
+ * because it's local-only — each operator's orchestrator session
3631
+ * maintains its own counter.
3632
+ *
3633
+ * @see RunRatioConfig
3634
+ */
3635
+ declare const DEFAULT_STATE_FILE_PATH = ".claude/state/orchestrator-runs.json";
3636
+ /**
3637
+ * Default recommended model label for dispatch runs. Rendered into
3638
+ * the orchestrator-conventions rule so agents and humans can read the
3639
+ * model pairing at a glance; the string is purely informational and
3640
+ * does not cause configulator to set `AGENT_MODEL` on the sub-agent.
3641
+ *
3642
+ * @see RunRatioConfig
3643
+ */
3644
+ declare const DEFAULT_DISPATCH_MODEL = "opus";
3645
+ /**
3646
+ * Default recommended model label for housekeeping runs. See
3647
+ * `DEFAULT_DISPATCH_MODEL` for the rendering contract. Housekeeping
3648
+ * runs are mechanical (batch PR review + maintenance scan), so a
3649
+ * cheaper model like Sonnet is the documented recommendation.
3650
+ *
3651
+ * @see RunRatioConfig
3652
+ */
3653
+ declare const DEFAULT_HOUSEKEEPING_MODEL = "sonnet";
3654
+ /**
3655
+ * Fully-resolved run-ratio settings. Every field is defaulted so
3656
+ * downstream renderers can reason about a single canonical shape.
3657
+ */
3658
+ interface ResolvedRunRatio {
3659
+ readonly enabled: boolean;
3660
+ readonly ratio: number;
3661
+ readonly stateFilePath: string;
3662
+ readonly dispatchModel: string;
3663
+ readonly housekeepingModel: string;
3664
+ }
3665
+ /**
3666
+ * Resolve a (possibly absent) `RunRatioConfig` into a canonical
3667
+ * `ResolvedRunRatio` with every field filled in. Unset fields
3668
+ * cascade from their documented defaults.
3669
+ *
3670
+ * Malformed configs (non-integer or non-positive ratio, empty or
3671
+ * whitespace-only state file path) throw a descriptive `Error` —
3672
+ * callers should not need to guard against it at runtime.
3673
+ */
3674
+ declare function resolveRunRatio(config?: RunRatioConfig): ResolvedRunRatio;
3675
+ /**
3676
+ * Synth-time validation hook. Throws a descriptive `Error` when the
3677
+ * supplied `RunRatioConfig` is malformed. Called by
3678
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
3679
+ * ratio fails the build instead of silently shipping broken
3680
+ * housekeeping cadence. Returns the resolved ratio unchanged so
3681
+ * callers can write `const rr = validateRunRatioConfig(config)` in
3682
+ * one line.
3683
+ *
3684
+ * Malformed cases rejected here:
3685
+ *
3686
+ * - `ratio` non-integer, zero, or negative.
3687
+ * - `stateFilePath` empty / whitespace-only, or an absolute path
3688
+ * (the state file must live inside the repo).
3689
+ */
3690
+ declare function validateRunRatioConfig(config?: RunRatioConfig): ResolvedRunRatio;
3691
+ /**
3692
+ * Compute the run type (`"dispatch"` or `"housekeeping"`) for a
3693
+ * given run counter value and resolved ratio. Used by the TypeScript
3694
+ * side (tests, downstream consumers that want to reason about the
3695
+ * cadence without shelling out). The shell helper produced by
3696
+ * `renderRunRatioShellHelpers` implements the same logic.
3697
+ *
3698
+ * Every `(ratio + 1)`th run is a housekeeping run; all others
3699
+ * dispatch. For `ratio = 4`, runs 1–4 dispatch and run 5
3700
+ * housekeeps; run 6 is again dispatch; run 10 housekeeps.
3701
+ */
3702
+ declare function classifyRun(runCounter: number, ratio: ResolvedRunRatio): "dispatch" | "housekeeping";
3703
+ /**
3704
+ * Render the markdown subsection appended to the
3705
+ * `orchestrator-conventions` rule. Always returns a non-empty string
3706
+ * so the orchestrator rule documents the cadence even when the
3707
+ * consumer relies on the defaults.
3708
+ */
3709
+ declare function renderRunRatioSection(ratio: ResolvedRunRatio): string;
3710
+ /**
3711
+ * Render a shell-script snippet embedded in `check-blocked.sh`. The
3712
+ * snippet declares a `run_counter_tick()` function that:
3713
+ *
3714
+ * 1. Reads the state file (creating it with `run_counter: 1` if
3715
+ * missing or unparseable).
3716
+ * 2. Increments the counter.
3717
+ * 3. Writes the new counter back atomically (temp file + `mv`).
3718
+ * 4. Echoes the post-increment counter and the classified run type
3719
+ * (`dispatch` or `housekeeping`) in the canonical
3720
+ * `run=<n> type=<dispatch|housekeeping>` format.
3721
+ *
3722
+ * Returns the body of a shell function block (including the
3723
+ * `run_counter_tick()` wrapper) so the surrounding script can splice
3724
+ * it inline at the exact indent level it wants.
3725
+ */
3726
+ declare function renderRunRatioShellHelpers(ratio: ResolvedRunRatio): string;
3727
+
3728
+ /**
3729
+ * Recommended model labels surfaced on the scheduled-task SKILL.md
3730
+ * frontmatter. The labels are **informational** — configulator does not
3731
+ * pin a model per task (the Claude Code scheduled-task runtime does not
3732
+ * support per-task model pinning yet). Operators choose the model at
3733
+ * invocation time; splitting workers by type still gives independent
3734
+ * cadence and clean opt-in/opt-out control.
3735
+ *
3736
+ * @see ScheduledTasksConfig
3737
+ */
3738
+ declare const SCHEDULED_TASK_MODEL_VALUES: readonly ["opus", "sonnet", "haiku"];
3739
+ type ScheduledTaskModel = (typeof SCHEDULED_TASK_MODEL_VALUES)[number];
3740
+ /**
3741
+ * Default root directory (relative to the repo root) for scheduled-task
3742
+ * files. Mirrors the vortex layout — one directory per task at
3743
+ * `.claude/scheduled-tasks/<taskId>/SKILL.md`.
3744
+ *
3745
+ * @see ScheduledTasksConfig
3746
+ */
3747
+ declare const DEFAULT_SCHEDULED_TASKS_ROOT = ".claude/scheduled-tasks";
3748
+ /**
3749
+ * Off-peak cron sample surfaced in the rendered documentation. Every
3750
+ * 20 minutes during off-peak hours (before 08:00 and after 14:00
3751
+ * local). Informational only — tasks ship disabled by default with
3752
+ * no cron, so the consumer must opt in and set a cron explicitly.
3753
+ *
3754
+ * @see ScheduledTasksConfig
3755
+ */
3756
+ declare const DEFAULT_OFF_PEAK_CRON_EXAMPLE = "3,23,43 0-7,14-23 * * *";
3757
+ /**
3758
+ * A single fully-resolved scheduled-task entry. Returned by
3759
+ * `resolveScheduledTasks()`; the rendered documentation section and
3760
+ * the emitted `.claude/scheduled-tasks/<taskId>/SKILL.md` files are
3761
+ * derived from this list.
3762
+ */
3763
+ interface ResolvedScheduledTask {
3764
+ /**
3765
+ * Unique task directory name. Emitted under
3766
+ * `<root>/<taskId>/SKILL.md`. Derived from the sub-agent name by
3767
+ * default (e.g. `company-profile-analyst` → `worker-company-profile`).
3768
+ */
3769
+ readonly taskId: string;
1706
3770
  /**
1707
- * Resolves template variables in rule content using project metadata.
1708
- * Emits synthesis warnings for rules with unresolved variables.
3771
+ * Target sub-agent name (e.g. `company-profile-analyst`). The task's
3772
+ * rendered prompt points operators at `.claude/agents/<agent>.md`.
1709
3773
  */
1710
- private resolveTemplates;
3774
+ readonly agent: string;
1711
3775
  /**
1712
- * Resolves template variables in skill instructions using project metadata.
3776
+ * Human-readable agent label for rendered tables and frontmatter
3777
+ * descriptions (e.g. `"Company Profile"`).
1713
3778
  */
1714
- private resolveSkillTemplates;
3779
+ readonly agentLabel: string;
1715
3780
  /**
1716
- * Resolves template variables in sub-agent prompts using project metadata.
3781
+ * Primary GitHub `type:*` label (without the `type:` prefix). When
3782
+ * `typeLabels` is unset, this is the sole type filter; when
3783
+ * `typeLabels` is set, it is the first element.
1717
3784
  */
1718
- private resolveSubAgentTemplates;
3785
+ readonly typeLabel: string;
1719
3786
  /**
1720
- * Resolves template variables in procedure content using project metadata.
3787
+ * Exact `type:*` label values (without the `type:` prefix) the
3788
+ * worker picks up. When set (length >= 1), represents a
3789
+ * multi-type filter (e.g. routing-bucket `worker-issue`). When
3790
+ * unset, the `typeLabel` single-value filter applies.
1721
3791
  */
1722
- private resolveProcedureTemplates;
3792
+ readonly typeLabels?: ReadonlyArray<string>;
3793
+ /**
3794
+ * Optional phase-label prefix (e.g. `company:`). When present and
3795
+ * `phaseLabels` is unset, the task's SKILL.md instructs the worker
3796
+ * to filter on both `type:<typeLabel>` **and** any `<phasePrefix>*`
3797
+ * label. Ignored when `phaseLabels` is set.
3798
+ */
3799
+ readonly phasePrefix?: string;
3800
+ /**
3801
+ * Exact phase-label values the worker filters on (e.g.
3802
+ * `["req:write"]`). When set (length >= 1), takes precedence over
3803
+ * `phasePrefix`. When unset, the `phasePrefix` prefix-match
3804
+ * applies.
3805
+ */
3806
+ readonly phaseLabels?: ReadonlyArray<string>;
3807
+ /**
3808
+ * Recommended model tier. Surfaced on the task's SKILL.md
3809
+ * frontmatter and in the rendered documentation table.
3810
+ */
3811
+ readonly recommendedModel: ScheduledTaskModel;
3812
+ /** Whether the task is emitted to disk. Default: `false`. */
3813
+ readonly enabled: boolean;
3814
+ /**
3815
+ * Optional cron expression. When `null` the task is manual-only
3816
+ * (runs only when an operator invokes it explicitly).
3817
+ */
3818
+ readonly cron: string | null;
3819
+ /**
3820
+ * Short one-line description for the rendered table and SKILL.md
3821
+ * frontmatter.
3822
+ */
3823
+ readonly description: string;
3824
+ }
3825
+ /**
3826
+ * Canonical default registry of scheduled-task entries. One entry per
3827
+ * agent bundle that ships with configulator. Every entry is
3828
+ * **disabled by default** — consumers must explicitly opt in via
3829
+ * `ScheduledTasksConfig.overrides[taskId].enabled = true`.
3830
+ *
3831
+ * The registry mirrors the funnel-tier table in `tiers.ts` so the
3832
+ * dispatch ordering, scheduled-task filter, and orchestrator queue
3833
+ * scan all agree on the type-label taxonomy.
3834
+ */
3835
+ declare const DEFAULT_SCHEDULED_TASK_ENTRIES: ReadonlyArray<ResolvedScheduledTask>;
3836
+ /**
3837
+ * Fully-resolved scheduled-tasks settings. Every field is defaulted so
3838
+ * downstream renderers can reason about a single canonical shape.
3839
+ */
3840
+ interface ResolvedScheduledTasks {
3841
+ readonly enabled: boolean;
3842
+ readonly root: string;
3843
+ readonly tasks: ReadonlyArray<ResolvedScheduledTask>;
3844
+ }
3845
+ /**
3846
+ * Resolve a (possibly absent) `ScheduledTasksConfig` into a canonical
3847
+ * `ResolvedScheduledTasks` with every field filled in. Unset fields
3848
+ * cascade from their documented defaults.
3849
+ *
3850
+ * The resolver merges three sources in this order:
3851
+ *
3852
+ * 1. `DEFAULT_SCHEDULED_TASK_ENTRIES` — the built-in per-agent registry.
3853
+ * 2. `config.overrides` — per-task consumer overrides keyed by `taskId`.
3854
+ * 3. `config.tasks` — fully consumer-authored entries. Entries whose
3855
+ * `taskId` matches a default entry **replace** it; entries with a new
3856
+ * `taskId` are appended.
3857
+ *
3858
+ * Malformed configs (unknown model, empty taskId/agent/typeLabel,
3859
+ * duplicate taskIds in a single supplied list) throw a descriptive
3860
+ * `Error` — callers should not need to guard against it at runtime.
3861
+ */
3862
+ declare function resolveScheduledTasks(config?: ScheduledTasksConfig): ResolvedScheduledTasks;
3863
+ /**
3864
+ * Synth-time validation hook. Throws a descriptive `Error` when the
3865
+ * supplied `ScheduledTasksConfig` is malformed. Called by
3866
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
3867
+ * scheduled-tasks table fails the build instead of silently shipping
3868
+ * broken worker prompts. Returns the resolved config unchanged so
3869
+ * callers can write `const st = validateScheduledTasksConfig(config)` in
3870
+ * one line.
3871
+ *
3872
+ * Malformed cases rejected here:
3873
+ *
3874
+ * - `root` empty, whitespace-only, or absolute.
3875
+ * - `overrides[taskId]` referencing an unknown `taskId`.
3876
+ * - Consumer-supplied `tasks` entry with unknown model, empty
3877
+ * `taskId` / `agent` / `typeLabel`, or cron string that is not a
3878
+ * plain string.
3879
+ * - Duplicate `taskId` values within the supplied `tasks` list.
3880
+ */
3881
+ declare function validateScheduledTasksConfig(config?: ScheduledTasksConfig): ResolvedScheduledTasks;
3882
+ /**
3883
+ * Render the markdown subsection appended to the
3884
+ * `orchestrator-conventions` rule. Always returns a non-empty string —
3885
+ * the default registry is non-empty so the section documents the
3886
+ * per-agent scheduled-task layout even when every task is disabled
3887
+ * (the default).
3888
+ */
3889
+ declare function renderScheduledTasksSection(resolved: ResolvedScheduledTasks): string;
3890
+ /**
3891
+ * Render the body of a single scheduled-task `SKILL.md` file. The
3892
+ * frontmatter carries the task name, description, and recommended
3893
+ * model; the body teaches the worker which label filter to apply and
3894
+ * which agent file to route issues to.
3895
+ *
3896
+ * The output is the full file contents — including the leading
3897
+ * frontmatter delimiter — so callers can hand it straight to a
3898
+ * `TextFile`.
3899
+ */
3900
+ declare function renderScheduledTaskSkillFile(task: ResolvedScheduledTask): string;
3901
+
3902
+ /**
3903
+ * Classified scope size for a single issue. Drives the dispatch
3904
+ * decision in the orchestrator — `small` / `medium` are dispatched,
3905
+ * `large` is rejected and decomposed.
3906
+ */
3907
+ declare const SCOPE_CLASS_VALUES: readonly ["small", "medium", "large"];
3908
+ type ScopeClass = (typeof SCOPE_CLASS_VALUES)[number];
3909
+ /**
3910
+ * Default acceptance-criteria thresholds — openhi's published
3911
+ * heuristic. An issue with at most 3 acceptance-criteria checkboxes
3912
+ * is `small`; at most 6 is `medium`; more than 6 is `large`.
3913
+ */
3914
+ declare const DEFAULT_AC_THRESHOLDS: ScopeGateThresholds;
3915
+ /**
3916
+ * Default sources thresholds — openhi's published heuristic. An
3917
+ * issue with at most 2 listed sources is `small`; at most 5 is
3918
+ * `medium`; more than 5 is `large`.
3919
+ */
3920
+ declare const DEFAULT_SOURCES_THRESHOLDS: ScopeGateThresholds;
3921
+ /**
3922
+ * Default decomposition-proposal comment body. The orchestrator
3923
+ * substitutes the following angle-bracketed uppercase-snake
3924
+ * placeholders at comment-composition time:
3925
+ *
3926
+ * - `<AC_COUNT>` — observed acceptance-criteria count.
3927
+ * - `<SOURCES_COUNT>` — observed sources count.
3928
+ * - `<AC_LIMIT>` — the `acceptanceCriteria.mediumMax` threshold.
3929
+ * - `<SOURCES_LIMIT>` — the `sources.mediumMax` threshold.
3930
+ *
3931
+ * The placeholder syntax deliberately avoids `{{curly-brace}}` form —
3932
+ * `AgentConfig`'s template resolver claims that namespace at rule
3933
+ * generation time, so a `{{acCount}}` placeholder would be rewritten
3934
+ * to `<acCount>` before the agent ever saw it.
3935
+ *
3936
+ * This template is deliberately generic so every consuming repo
3937
+ * can adopt it without customization — project-specific phrasing
3938
+ * belongs in `ScopeGateConfig.decompositionTemplate`.
3939
+ */
3940
+ declare const DEFAULT_DECOMPOSITION_TEMPLATE: string;
3941
+ /**
3942
+ * Fully-resolved scope-gate settings. Every field is defaulted so
3943
+ * downstream renderers can reason about a single canonical shape.
3944
+ */
3945
+ interface ResolvedScopeGate {
3946
+ readonly enabled: boolean;
3947
+ readonly acceptanceCriteria: ScopeGateThresholds;
3948
+ readonly sources: ScopeGateThresholds;
3949
+ readonly autoFile: boolean;
3950
+ readonly decompositionTemplate: string;
3951
+ }
3952
+ /**
3953
+ * Resolve a (possibly absent) `ScopeGateConfig` into a canonical
3954
+ * `ResolvedScopeGate` with every field filled in. Unset fields
3955
+ * cascade from their documented defaults.
3956
+ *
3957
+ * Malformed configs (negative or non-integer thresholds, inverted
3958
+ * ranges) throw a descriptive `Error` — callers should not need to
3959
+ * guard against it at runtime.
3960
+ */
3961
+ declare function resolveScopeGate(config?: ScopeGateConfig): ResolvedScopeGate;
3962
+ /**
3963
+ * Synth-time validation hook. Throws a descriptive `Error` when the
3964
+ * supplied `ScopeGateConfig` is malformed. Called by
3965
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
3966
+ * gate fails the build instead of silently shipping broken dispatch
3967
+ * thresholds. Returns the resolved gate unchanged so callers can
3968
+ * write `const gate = validateScopeGateConfig(config)` in one line.
3969
+ *
3970
+ * Malformed cases rejected here:
3971
+ *
3972
+ * - Threshold values that are negative or non-integer.
3973
+ * - Threshold ranges where `mediumMax <= smallMax` (the gate would
3974
+ * never classify an issue as `medium`).
3975
+ */
3976
+ declare function validateScopeGateConfig(config?: ScopeGateConfig): ResolvedScopeGate;
3977
+ /**
3978
+ * Classify a raw issue body against a resolved scope gate. Returns
3979
+ * the scope class and the observed counts so the orchestrator can
3980
+ * embed them in the decomposition-proposal comment.
3981
+ *
3982
+ * The parser is deliberately tolerant:
3983
+ *
3984
+ * - Acceptance-criteria checkboxes — lines matching `- [ ]` or
3985
+ * `- [x]` (case-insensitive) under a `## Acceptance Criteria`
3986
+ * heading (or any heading whose normalized text equals
3987
+ * `acceptance criteria`). Stops at the next heading.
3988
+ * - Sources — bullet list items (`- ` or `* `) under any of
3989
+ * `## Inputs`, `## References`, `## Sources` (case-insensitive).
3990
+ * Counts from every matching section are summed, so an issue
3991
+ * that uses both `## Inputs` and `## References` has its sources
3992
+ * counted across both.
3993
+ *
3994
+ * An issue with **no** `## Acceptance Criteria` section produces an
3995
+ * `acCount` of 0 and is classified `small` on the AC axis. An issue
3996
+ * body that's pure prose with no recognizable sections classifies
3997
+ * `small` — the gate never rejects an issue it can't read.
3998
+ */
3999
+ declare function classifyIssueScope(body: string, gate: ResolvedScopeGate): {
4000
+ readonly scope: ScopeClass;
4001
+ readonly acCount: number;
4002
+ readonly sourcesCount: number;
4003
+ };
4004
+ /**
4005
+ * Render the markdown subsection appended to the
4006
+ * `orchestrator-conventions` rule. Always returns a non-empty string
4007
+ * so the orchestrator rule documents the scope gate even when the
4008
+ * consumer relies on the defaults.
4009
+ */
4010
+ declare function renderScopeGateSection(gate: ResolvedScopeGate): string;
4011
+ /**
4012
+ * Render a shell-script snippet embedded in `check-blocked.sh`. The
4013
+ * snippet declares a `scope_of()` function that reads an issue body
4014
+ * (passed as `$1`) and echoes one of `small` / `medium` / `large`.
4015
+ * Orchestrator-side bash hooks call this function before dispatch.
4016
+ *
4017
+ * Returns the body of a shell function block (including the
4018
+ * `scope_of()` wrapper) so the surrounding script can splice it
4019
+ * inline at the exact indent level it wants.
4020
+ */
4021
+ declare function renderScopeGateShellHelpers(gate: ResolvedScopeGate): string;
4022
+
4023
+ /**
4024
+ * Valid funnel-tier values. Lower numbers dispatch first when priority
4025
+ * is tied. See `DEFAULT_AGENT_TIERS` for the role of each tier.
4026
+ */
4027
+ declare const AGENT_TIER_VALUES: readonly [0, 1, 2, 3, 4];
4028
+ type AgentTier = (typeof AGENT_TIER_VALUES)[number];
4029
+ /**
4030
+ * Human-readable role name for each funnel tier. Rendered into the
4031
+ * orchestrator-conventions rule and surfaced in generated `PICK` lines
4032
+ * so agents and humans can read the sort key at a glance.
4033
+ */
4034
+ declare const AGENT_TIER_ROLES: Readonly<Record<AgentTier, string>>;
4035
+ /**
4036
+ * A single resolved agent-type → tier mapping. Returned by
4037
+ * `resolveAgentTiers()`; the rendered table in the orchestrator rule
4038
+ * content and the lookup table embedded in `check-blocked.sh` are
4039
+ * derived from this list.
4040
+ */
4041
+ interface ResolvedAgentTier {
1723
4042
  /**
1724
- * Collects Claude permission entries from all active bundles.
4043
+ * GitHub `type:*` label value (e.g. `"feat"`, `"research"`,
4044
+ * `"company-profile"`). The leading `type:` prefix is **not** part
4045
+ * of the stored value — it is added when the resolver stringifies
4046
+ * the lookup table.
1725
4047
  */
1726
- private resolveBundlePermissions;
4048
+ readonly type: string;
4049
+ /** Funnel tier 0–4 (lower dispatches first on a priority tie). */
4050
+ readonly tier: AgentTier;
4051
+ /** Human-readable tier role (routing / research / profiles / synthesis / support). */
4052
+ readonly role: string;
1727
4053
  }
1728
-
1729
4054
  /**
1730
- * Agenda bundle enabled by default.
4055
+ * Canonical default mapping of GitHub `type:*` label values to funnel
4056
+ * tiers. Mirrors openhi's `DISPATCHER.md` Dispatch Table plus the
4057
+ * taxonomy documented in the Group D epic (#414, issue #473).
1731
4058
  *
1732
- * Consuming projects can disable it with
1733
- * `excludeBundles: ["agenda"]`. `appliesWhen` always returns `true`
1734
- * (peer-present assumption, same pattern as the other workflow
1735
- * bundles).
4059
+ * - **Tier 0 routing.** Unblocks other work. Picked first on a
4060
+ * priority tie. Covers the issue-worker's own type labels
4061
+ * (`feat`, `fix`, `chore`, `refactor`, `docs`, `release`,
4062
+ * `hotfix`) plus classification-style labels (`plan`, `review`,
4063
+ * `adr`).
4064
+ * - **Tier 1 — research.** Feeds downstream pipelines.
4065
+ * - **Tier 2 — profiles.** Consumes research.
4066
+ * - **Tier 3 — synthesis.** Produces deliverables.
4067
+ * - **Tier 4 — support.** Important but not pipeline-critical.
1736
4068
  *
1737
- * Provides a 2-phase pre-meeting agenda pipeline
1738
- * (draft → finalize), complementing the post-meeting pipeline in
1739
- * the `meeting-analysis` bundle. Ships a sub-agent, two user-
1740
- * invocable skills (`/draft-agenda`, `/finalize-agenda`), and
1741
- * `agenda:*` phase labels via the bundle `labels` mechanism so
1742
- * consuming projects automatically pick up the label taxonomy
1743
- * through the sync-labels workflow.
4069
+ * Consumers extend or override this list via
4070
+ * `AgentConfigOptions.tiers` (see `resolveAgentTiers`). Every
4071
+ * registered agent type must resolve to exactly one tier; unmapped
4072
+ * types fail synth-time validation.
4073
+ */
4074
+ declare const DEFAULT_AGENT_TIERS: ReadonlyArray<ResolvedAgentTier>;
4075
+ /**
4076
+ * Fallback tier applied to issues whose `type:*` label does not match
4077
+ * any entry in the resolved tier table. Using tier 0 (routing) means
4078
+ * an unclassified or newly-introduced issue is dispatched **before**
4079
+ * lower-tier work on a priority tie, which matches the openhi
4080
+ * dispatcher's "routing unblocks other work" rule. The synth-time
4081
+ * validator still rejects **registered** custom types that omit a
4082
+ * tier assignment — the fallback exists only for unknown labels
4083
+ * encountered at runtime.
4084
+ */
4085
+ declare const UNKNOWN_TYPE_FALLBACK_TIER: AgentTier;
4086
+ /**
4087
+ * Resolve a (possibly absent) consumer-supplied `AgentTierConfig` into
4088
+ * a deduplicated list of `ResolvedAgentTier` entries.
1744
4089
  *
1745
- * Reuses the meeting-type taxonomy from
1746
- * `AgentConfigOptions.meetings.meetingTypes` — the same table the
1747
- * `meeting-analysis` bundle consumes for post-meeting extraction.
4090
+ * Precedence:
4091
+ *
4092
+ * 1. `config.tiers` fully **replaces** the default list when supplied.
4093
+ * This is the escape hatch for repos that want a bespoke taxonomy.
4094
+ * 2. `config.customTypes` entries **extend** whatever list is in play
4095
+ * (default or replacement). Later entries override earlier ones on
4096
+ * `type` collision, so consumer overrides win over defaults.
4097
+ *
4098
+ * @throws `Error` when any entry references a tier outside 0–4, when a
4099
+ * `type` is empty/whitespace, or when `config.tiers` is an
4100
+ * empty array (use omission to mean "keep the defaults").
1748
4101
  */
1749
- declare const agendaBundle: AgentRuleBundle;
1750
-
4102
+ declare function resolveAgentTiers(config?: AgentTierConfig): ReadonlyArray<ResolvedAgentTier>;
1751
4103
  /**
1752
- * AWS CDK bundle auto-detected when `aws-cdk-lib` is in dependencies.
4104
+ * Synth-time validation hook. Throws a descriptive `Error` when the
4105
+ * resolved tier list is malformed. Called by `AgentConfig` before
4106
+ * rendering so a misconfigured `AgentTierConfig` fails the build
4107
+ * instead of silently shipping broken sort keys.
4108
+ *
4109
+ * Malformed cases rejected here:
4110
+ *
4111
+ * - Duplicate `type` values **within** the same supplied list (the
4112
+ * resolver dedupes between the default list and `customTypes`, so
4113
+ * those collisions are fine; duplicates inside one list are not).
4114
+ * - Tier values outside 0–4.
4115
+ * - Empty or whitespace-only `type` strings.
4116
+ *
4117
+ * Returns the validated list unchanged so callers can write
4118
+ * `const tiers = validateAgentTierConfig(config)` in one line.
1753
4119
  */
1754
- declare const awsCdkBundle: AgentRuleBundle;
1755
-
4120
+ declare function validateAgentTierConfig(config?: AgentTierConfig): ReadonlyArray<ResolvedAgentTier>;
1756
4121
  /**
1757
- * Base bundle always included unless `includeBaseRules: false`.
1758
- * Contains project-overview, interaction-style, and general-conventions rules.
4122
+ * Render the funnel-tier subsection appended to the
4123
+ * `orchestrator-conventions` rule. Always returns a non-empty string
4124
+ * because the default tier list is non-empty — the orchestrator
4125
+ * always documents its sort order.
1759
4126
  */
1760
- declare const baseBundle: AgentRuleBundle;
4127
+ declare function renderAgentTierSection(tiers: ReadonlyArray<ResolvedAgentTier>): string;
4128
+ /**
4129
+ * Render a shell-script snippet that the `check-blocked.sh` procedure
4130
+ * uses to look up a tier for a given `type:*` label. Emitted as a
4131
+ * `case` statement so the generated script stays POSIX-shell
4132
+ * compatible (no associative arrays).
4133
+ *
4134
+ * The function returns the body of a shell function, not the
4135
+ * surrounding function wrapper, so bundle code can splice it inline
4136
+ * at the exact indent level it wants.
4137
+ */
4138
+ declare function renderAgentTierCaseStatement(tiers: ReadonlyArray<ResolvedAgentTier>): string;
1761
4139
 
1762
4140
  /**
1763
- * BCM writer bundle enabled by default for projects that adopt this
1764
- * batch.
4141
+ * Default for whether the unblock-dependents sweep runs at all. When
4142
+ * the consumer omits `UnblockDependentsConfig`, the bundle ships with
4143
+ * the sweep **enabled** so every `status:done` transition
4144
+ * automatically propagates into the dependency graph.
1765
4145
  *
1766
- * Consuming projects can disable it with `excludeBundles: ["bcm-writer"]`.
1767
- * `appliesWhen` always returns `true` per this batch's directive that
1768
- * bundles assume peers are present.
4146
+ * @see UnblockDependentsConfig
4147
+ */
4148
+ declare const DEFAULT_UNBLOCK_DEPENDENTS_ENABLED = true;
4149
+ /**
4150
+ * Default comment body posted on a newly-unblocked issue. Variables
4151
+ * are substituted at runtime by the `unblock-dependents.sh` script:
1769
4152
  *
1770
- * Ships a single consolidated sub-agent (`bcm-writer`) with all 4 phase",
1771
- * handlers in one prompt (outline, scaffold, context, connect), a
1772
- * user-invocable skill (`/write-bcm`), and `type:bcm-document` plus
1773
- * `bcm:*` phase labels.
4153
+ * - `<CLOSED_ISSUE>` the `#<n>` reference to the issue whose
4154
+ * closure triggered the sweep (e.g. `#123`).
1774
4155
  *
1775
- * The bundle assumes the `people-profile`, `company-profile`, and
1776
- * `research-pipeline` bundles are also enabled so Phase 4 can hand off
1777
- * surfaced items via `people:research`, `company:research`, and
1778
- * `research:scope` issues.
4156
+ * The placeholder syntax deliberately avoids `{{curly-brace}}` form —
4157
+ * `AgentConfig`'s template resolver claims that namespace at rule
4158
+ * generation time, so a `{{closedIssue}}` placeholder would be
4159
+ * rewritten before the agent ever saw it.
1779
4160
  */
1780
- declare const bcmWriterBundle: AgentRuleBundle;
1781
-
4161
+ declare const DEFAULT_UNBLOCK_COMMENT_TEMPLATE = "Dependencies resolved by <CLOSED_ISSUE> \u2014 unblocking.";
1782
4162
  /**
1783
- * Business-models bundle enabled by default.
4163
+ * Default comment body posted on a dependent whose other dependencies
4164
+ * are still open (partial unblock). Variables substituted at runtime:
1784
4165
  *
1785
- * Consuming projects can disable it with
1786
- * `excludeBundles: ["business-models"]`. `appliesWhen` always returns
1787
- * `true` per the workflow-bundle peer-present assumption.
4166
+ * - `<CLOSED_ISSUE>` the just-closed issue (`#<n>`).
4167
+ * - `<OPEN_DEPS>` — space-separated list of remaining open
4168
+ * dependencies (e.g. `#45 #47`).
1788
4169
  *
1789
- * Ships a sub-agent (`business-models-analyst`), three user-invocable
1790
- * skills (`/scan-business-models`, `/canvas-business-model`,
1791
- * `/complete-business-model`), a canvas template (emitted alongside
1792
- * the canvas skill), and `type:business-model` plus
1793
- * `business-models:*` phase labels.
4170
+ * Applied when `flagPartialUnblockWithAttention` is `true`; otherwise
4171
+ * no comment is posted and the dependent is left untouched.
4172
+ */
4173
+ declare const DEFAULT_PARTIAL_UNBLOCK_COMMENT_TEMPLATE = "Dependency <CLOSED_ISSUE> resolved, but still waiting on: <OPEN_DEPS>.";
4174
+ /**
4175
+ * Fully-resolved unblock-dependents settings. Every field is defaulted
4176
+ * so downstream renderers can reason about a single canonical shape.
4177
+ */
4178
+ interface ResolvedUnblockDependents {
4179
+ readonly enabled: boolean;
4180
+ readonly commentTemplate: string;
4181
+ readonly flagPartialUnblockWithAttention: boolean;
4182
+ readonly partialUnblockCommentTemplate: string;
4183
+ }
4184
+ /**
4185
+ * Resolve a (possibly absent) `UnblockDependentsConfig` into a canonical
4186
+ * `ResolvedUnblockDependents` with every field filled in. Unset fields
4187
+ * cascade from their documented defaults.
1794
4188
  *
1795
- * The bundle sits between `industry-discovery` (upstream, selects
1796
- * verticals) and `bcm-writer` (downstream, models capabilities). It
1797
- * assumes `bcm-writer` is enabled so Phase 3 can hand off surfaced
1798
- * capabilities via `bcm:outline` issues, and it is read by
1799
- * `company-profile` via the shared `<BUSINESS_MODELS_ROOT>` default
1800
- * path (`docs/src/content/docs/industry-research/`).
4189
+ * Malformed configs (empty / whitespace-only `commentTemplate`) throw
4190
+ * a descriptive `Error` callers should not need to guard against it
4191
+ * at runtime.
1801
4192
  */
1802
- declare const businessModelsBundle: AgentRuleBundle;
4193
+ declare function resolveUnblockDependents(config?: UnblockDependentsConfig): ResolvedUnblockDependents;
4194
+ /**
4195
+ * Synth-time validation hook. Throws a descriptive `Error` when the
4196
+ * supplied `UnblockDependentsConfig` is malformed. Called by
4197
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
4198
+ * sweep fails the build instead of silently shipping a broken
4199
+ * procedure script. Returns the resolved config unchanged so callers
4200
+ * can write `const ud = validateUnblockDependentsConfig(config)` in
4201
+ * one line.
4202
+ *
4203
+ * Malformed cases rejected here:
4204
+ *
4205
+ * - `commentTemplate` empty or whitespace-only.
4206
+ * - `partialUnblockCommentTemplate` empty or whitespace-only.
4207
+ */
4208
+ declare function validateUnblockDependentsConfig(config?: UnblockDependentsConfig): ResolvedUnblockDependents;
4209
+ /**
4210
+ * Render the markdown subsection appended to the
4211
+ * `orchestrator-conventions` rule. Always returns a non-empty string
4212
+ * so the orchestrator rule documents the contract even when the
4213
+ * consumer relies on the defaults.
4214
+ */
4215
+ declare function renderUnblockDependentsSection(ud: ResolvedUnblockDependents): string;
4216
+ /**
4217
+ * Render the full `unblock-dependents.sh` script body for a given
4218
+ * resolved unblock-dependents config. The script takes a single
4219
+ * positional argument (the just-closed issue number) and emits one
4220
+ * line per processed dependent in the canonical
4221
+ * `UNBLOCKED` / `STILL_BLOCKED` / `NO_DEPENDENTS` format.
4222
+ *
4223
+ * Exported so `AgentConfig.preSynthesize` can emit the procedure
4224
+ * alongside `check-blocked.sh`.
4225
+ */
4226
+ declare function renderUnblockDependentsScript(ud: ResolvedUnblockDependents): string;
4227
+
4228
+ /**
4229
+ * Build the check-blocked.sh procedure definition for a given resolved
4230
+ * tier table, scope gate, run-ratio, and pre-flight config.
4231
+ * `AgentConfig.preSynthesize` calls this with the consumer's resolved
4232
+ * configs so the emitted script's `tier_of()` lookup, `scope_of()`
4233
+ * thresholds, `run_counter_tick()` cycle length, and `cmd_preflight()`
4234
+ * eligibility filter match whatever the rendered
4235
+ * orchestrator-conventions rule documents.
4236
+ *
4237
+ * Scope-gate settings default to the bundle's built-in defaults
4238
+ * (small: ≤3 AC + ≤2 sources; medium: ≤6 AC + ≤5 sources;
4239
+ * auto-file off) when the caller omits them. Run-ratio settings
4240
+ * default to the openhi 4:1 cadence with the counter persisted at
4241
+ * `.claude/state/orchestrator-runs.json`. Pre-flight settings default
4242
+ * to vortex's step 0b contract (enabled, delegated to the
4243
+ * `pr-reviewer` sub-agent, squash merges, linked-issue keyword
4244
+ * required).
4245
+ */
4246
+ declare function buildCheckBlockedProcedure(tiers: ReadonlyArray<ResolvedAgentTier>, scopeGate?: ResolvedScopeGate, runRatio?: ResolvedRunRatio, preflight?: ResolvedPreflightPr): AgentProcedure;
4247
+ /*******************************************************************************
4248
+ *
4249
+ * unblock-dependents.sh — Targeted post-close dependency sweep.
4250
+ *
4251
+ * Called by every agent that applies `status:done` to an issue. The
4252
+ * script searches open issues for `Depends on: #<just-closed>` and
4253
+ * flips fully-resolved dependents from `status:blocked` to
4254
+ * `status:ready`.
4255
+ *
4256
+ * `buildUnblockDependentsProcedure()` is the factory that parameterises
4257
+ * the rendered script with a resolved `ResolvedUnblockDependents`;
4258
+ * `unblockDependentsProcedure` (declared below) is the default
4259
+ * instance that ships when the consumer supplies no override.
4260
+ *
4261
+ ******************************************************************************/
4262
+ declare function buildUnblockDependentsProcedure(unblockDependents?: ResolvedUnblockDependents): AgentProcedure;
4263
+ /**
4264
+ * Build the orchestrator-conventions rule content for a given resolved
4265
+ * tier table, scope gate, run-ratio, pre-flight, scheduled-tasks, and
4266
+ * unblock-dependents config. The preamble is constant; each section
4267
+ * below it is rendered from the supplied values so consumer overrides
4268
+ * propagate into the generated rule.
4269
+ *
4270
+ * Every optional parameter defaults to the bundle's built-in default
4271
+ * when the caller omits it.
4272
+ */
4273
+ declare function buildOrchestratorConventionsContent(tiers: ReadonlyArray<ResolvedAgentTier>, scopeGate?: ResolvedScopeGate, runRatio?: ResolvedRunRatio, preflight?: ResolvedPreflightPr, scheduledTasks?: ResolvedScheduledTasks, unblockDependents?: ResolvedUnblockDependents): string;
4274
+ /**
4275
+ * Resolve the orchestrator-conventions rule content and the
4276
+ * check-blocked.sh procedure content for a given (possibly absent)
4277
+ * consumer-supplied tier config, scope-gate config, run-ratio config,
4278
+ * pre-flight config, and scheduled-tasks config. Called by
4279
+ * `AgentConfig.preSynthesize`.
4280
+ *
4281
+ * Returns the resolved tier table, scope gate, run ratio, pre-flight,
4282
+ * and scheduled-tasks config alongside both rendered artifacts so
4283
+ * callers can splice them into their rule map and procedure map in a
4284
+ * single pass.
4285
+ */
4286
+ declare function resolveOrchestratorAssets(tierConfig?: AgentTierConfig, scopeGateConfig?: ScopeGateConfig, runRatioConfig?: RunRatioConfig, preflightPrConfig?: PreflightPrConfig, scheduledTasksConfig?: ScheduledTasksConfig, unblockDependentsConfig?: UnblockDependentsConfig): {
4287
+ readonly tiers: ReadonlyArray<ResolvedAgentTier>;
4288
+ readonly scopeGate: ResolvedScopeGate;
4289
+ readonly runRatio: ResolvedRunRatio;
4290
+ readonly preflight: ResolvedPreflightPr;
4291
+ readonly scheduledTasks: ResolvedScheduledTasks;
4292
+ readonly unblockDependents: ResolvedUnblockDependents;
4293
+ readonly conventionsContent: string;
4294
+ readonly procedure: AgentProcedure;
4295
+ readonly unblockDependentsProcedure: AgentProcedure;
4296
+ };
4297
+ /*******************************************************************************
4298
+ *
4299
+ * Bundle definition
4300
+ *
4301
+ ******************************************************************************/
4302
+ declare const orchestratorBundle: AgentRuleBundle;
1803
4303
 
1804
4304
  /**
1805
- * Company-profile bundle — enabled by default.
4305
+ * People-profile bundle — enabled by default.
1806
4306
  *
1807
4307
  * Consuming projects can disable it with
1808
- * `excludeBundles: ["company-profile"]`. `appliesWhen` always returns
4308
+ * `excludeBundles: ["people-profile"]`. `appliesWhen` always returns
1809
4309
  * `true` per the operating-system directive that bundles assume peers
1810
4310
  * are present — in Phase 3 this bundle hands work off to
1811
- * `people-profile` (via `people:research`) and `software-profile` (via
1812
- * `software:research`).
4311
+ * `company-profile` (via `company:research`) and `software-profile`
4312
+ * (via `software:research`).
1813
4313
  *
1814
- * Ships a sub-agent (`company-profile-analyst`), four user-invocable
1815
- * skills (`/profile-company`, `/match-company`, `/refresh-company`,
1816
- * `/analyze-segment`), and `type:company-profile` plus `company:*`
1817
- * phase labels for the six phases.
4314
+ * Ships a sub-agent (`people-profile-analyst`), two user-invocable
4315
+ * skills (`/profile-person`, `/refresh-person`), and `type:people-profile`
4316
+ * plus `people:*` phase labels for the four phases.
1818
4317
  */
1819
- declare const companyProfileBundle: AgentRuleBundle;
4318
+ declare function buildPeopleProfileBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
4319
+ /**
4320
+ * Default-paths instance of the people-profile bundle, preserved for
4321
+ * backward compatibility with consumers that import the const
4322
+ * directly. The factory above is the canonical entry point when a
4323
+ * consumer supplies `AgentConfigOptions.paths`.
4324
+ */
4325
+ declare const peopleProfileBundle: AgentRuleBundle;
1820
4326
 
1821
4327
  /**
1822
- * GitHub workflow bundle — auto-detected when the project has a GitHub component.
4328
+ * PNPM bundle — auto-detected when the PnpmWorkspace component is present.
1823
4329
  */
1824
- declare const githubWorkflowBundle: AgentRuleBundle;
4330
+ declare const pnpmBundle: AgentRuleBundle;
1825
4331
 
1826
4332
  /**
1827
- * Industry-discovery bundle enabled by default.
4333
+ * Default master switch for the issue-templates convention. When no
4334
+ * config is supplied the convention ships **enabled** so every
4335
+ * configulator-consuming repo carries the canonical `gh issue create`
4336
+ * template reference in its rendered `CLAUDE.md`.
1828
4337
  *
1829
- * Consuming projects can disable it with
1830
- * `excludeBundles: ["industry-discovery"]`. `appliesWhen` always returns
1831
- * `true` per this batch's directive that bundles assume peers are
1832
- * present.
4338
+ * @see IssueTemplatesConfig
4339
+ */
4340
+ declare const DEFAULT_ISSUE_TEMPLATES_ENABLED = true;
4341
+ /**
4342
+ * Default repo-relative path for the consolidated issue-templates
4343
+ * documentation page. Matches the singleton `/docs` site layout every
4344
+ * configulator-managed repo ships: a single Starlight docs site at
4345
+ * `/docs` with agent reference pages under
4346
+ * `docs/src/content/docs/agents/`.
1833
4347
  *
1834
- * Ships a sub-agent (`industry-discovery-analyst`), a user-invocable
1835
- * skill (`/discover-industries`), and `type:industry-discovery` plus
1836
- * `industry:*` phase labels.
4348
+ * The file is never generated by configulator unless `emitStarterDoc`
4349
+ * is set — the canonical list of templates is repo-specific and grows
4350
+ * whenever a new phase label is minted, so consumers author and evolve
4351
+ * the page themselves. The starter doc is opt-in.
1837
4352
  *
1838
- * The bundle assumes the `research-pipeline` bundle is also enabled so
1839
- * Phase 3 can hand off cleared verticals via `research:scope` issues.
4353
+ * @see IssueTemplatesConfig
1840
4354
  */
1841
- declare const industryDiscoveryBundle: AgentRuleBundle;
1842
-
4355
+ declare const DEFAULT_ISSUE_TEMPLATES_PATH = "docs/src/content/docs/agents/issue-templates.md";
1843
4356
  /**
1844
- * Jest bundle auto-detected when Jest is in dependencies.
4357
+ * Default list of glob patterns that identify "bundle files" — the
4358
+ * source files that compose agent prompts and skill instructions.
4359
+ * These are the locations the optional lint walks when checking that
4360
+ * `gh issue create` snippets are **referenced** rather than inlined.
4361
+ *
4362
+ * The defaults cover the two canonical locations bundle-like content
4363
+ * lives in a configulator-consuming repo:
4364
+ *
4365
+ * - `packages/@codedrifters/configulator/src/agent/bundles/**.ts` —
4366
+ * the bundle authoring sites inside configulator itself.
4367
+ * - `.claude/agents/**.md` / `.claude/skills/**` — agent and skill
4368
+ * prompts in consuming repos that don't re-export configulator
4369
+ * bundles.
4370
+ *
4371
+ * Consumers can replace the list outright via `bundlePathPatterns`
4372
+ * when their agent sources live elsewhere.
4373
+ *
4374
+ * @see IssueTemplatesConfig
1845
4375
  */
1846
- declare const jestBundle: AgentRuleBundle;
1847
-
4376
+ declare const DEFAULT_ISSUE_TEMPLATES_BUNDLE_PATH_PATTERNS: ReadonlyArray<string>;
1848
4377
  /**
1849
- * Maintenance-audit bundle enabled by default.
4378
+ * Default for whether the convention emits the
4379
+ * `.claude/procedures/check-issue-templates.sh` lint to disk. The
4380
+ * script greps the provided files (stdin or positional args) for
4381
+ * inline `gh issue create` invocations and fails non-zero when any
4382
+ * are found outside a fenced example block that cites the canonical
4383
+ * templates doc.
1850
4384
  *
1851
- * Consuming projects can disable it with
1852
- * `excludeBundles: ["maintenance-audit"]`. `appliesWhen` always returns
1853
- * `true` per this batch's directive that bundles assume peers are
1854
- * present.
4385
+ * Disabled by default because many consumers prefer to enforce the
4386
+ * rule via review discipline and the rendered guidance alone; the
4387
+ * script is opt-in for repos that want a hard CI gate or pre-commit
4388
+ * hook.
1855
4389
  *
1856
- * Provides a 3-phase documentation-maintenance pipeline
1857
- * (scan → fix → verify) designed for any project with structured doc
1858
- * registries and cross-references. Ships a sub-agent, two user-
1859
- * invocable skills (`/audit-docs`, `/verify-audit`), and `maint:*`
1860
- * phase labels via the bundle `labels` mechanism so consuming projects
1861
- * automatically pick up the label taxonomy through the sync-labels
1862
- * workflow.
4390
+ * @see IssueTemplatesConfig
1863
4391
  */
1864
- declare const maintenanceAuditBundle: AgentRuleBundle;
1865
-
4392
+ declare const DEFAULT_ISSUE_TEMPLATES_EMIT_CHECKER = false;
1866
4393
  /**
1867
- * Meeting analysis bundle included by default.
1868
- * Provides a 4-phase meeting transcript processing workflow.
4394
+ * Default for whether the convention emits a minimal starter
4395
+ * issue-templates page to disk at `<templatesPath>`. The starter
4396
+ * carries the expected structure (one `## Template: <phase-label>`
4397
+ * heading per known phase plus a placeholder body) so consumers
4398
+ * adopting the convention on a green-field repo have a working
4399
+ * template to extend.
4400
+ *
4401
+ * Disabled by default because the page is hand-authored and most
4402
+ * repos adopt the convention after they already maintain their own
4403
+ * ad-hoc notes — an emitted stub would conflict with existing
4404
+ * content.
4405
+ *
4406
+ * @see IssueTemplatesConfig
1869
4407
  */
1870
- declare const meetingAnalysisBundle: AgentRuleBundle;
1871
-
1872
- /*******************************************************************************
4408
+ declare const DEFAULT_ISSUE_TEMPLATES_EMIT_STARTER = false;
4409
+ /**
4410
+ * Default for whether the rendered rule body asserts that every
4411
+ * `gh issue create` recipe in a bundle or agent prompt **MUST** cite
4412
+ * the canonical templates doc rather than inline a full template.
1873
4413
  *
1874
- * Bundle definition
4414
+ * Defaults to `true` — the whole point of consolidation is that
4415
+ * templates live in one place, so the MUST phrasing is the correct
4416
+ * default. Consumers that treat consolidation as aspirational can
4417
+ * soften the phrasing by setting this to `false`.
1875
4418
  *
1876
- ******************************************************************************/
1877
- declare const orchestratorBundle: AgentRuleBundle;
4419
+ * @see IssueTemplatesConfig
4420
+ */
4421
+ declare const DEFAULT_ISSUE_TEMPLATES_REQUIRE_REFERENCE = true;
4422
+ /**
4423
+ * Fully-resolved issue-templates settings. Every field is defaulted
4424
+ * so downstream renderers can reason about a single canonical shape.
4425
+ */
4426
+ interface ResolvedIssueTemplates {
4427
+ readonly enabled: boolean;
4428
+ readonly templatesPath: string;
4429
+ readonly bundlePathPatterns: ReadonlyArray<string>;
4430
+ readonly emitChecker: boolean;
4431
+ readonly emitStarterDoc: boolean;
4432
+ readonly requireReference: boolean;
4433
+ }
4434
+ /**
4435
+ * Resolve a (possibly absent) `IssueTemplatesConfig` into a canonical
4436
+ * `ResolvedIssueTemplates` with every field filled in. Unset fields
4437
+ * cascade from their documented defaults.
4438
+ *
4439
+ * Malformed configs — empty / whitespace-only or absolute
4440
+ * `templatesPath`, empty `bundlePathPatterns`, empty /
4441
+ * whitespace-only path entry — throw a descriptive `Error`.
4442
+ */
4443
+ declare function resolveIssueTemplates(config?: IssueTemplatesConfig): ResolvedIssueTemplates;
4444
+ /**
4445
+ * Synth-time validation hook. Throws a descriptive `Error` when the
4446
+ * supplied `IssueTemplatesConfig` is malformed. Called by
4447
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
4448
+ * convention fails the build instead of silently shipping broken
4449
+ * guidance. Returns the resolved config unchanged so callers can
4450
+ * write `const it = validateIssueTemplatesConfig(config)` in one line.
4451
+ *
4452
+ * Malformed cases rejected here:
4453
+ *
4454
+ * - `templatesPath` empty, whitespace-only, or absolute.
4455
+ * - `bundlePathPatterns` not an array, empty, or contains an empty /
4456
+ * whitespace-only entry.
4457
+ */
4458
+ declare function validateIssueTemplatesConfig(config?: IssueTemplatesConfig): ResolvedIssueTemplates;
4459
+ /**
4460
+ * Render the full body for the `issue-templates-convention` rule
4461
+ * shipped by the `base` bundle. The rule documents:
4462
+ *
4463
+ * - Why the convention exists (drift between duplicated
4464
+ * `gh issue create` snippets across bundles).
4465
+ * - The on-disk contract — a single hand-authored page at
4466
+ * `<templatesPath>` with one `## Template: <phase-label>` section
4467
+ * per downstream issue kind.
4468
+ * - The **reference-don't-inline** rule, phrased as a hard
4469
+ * requirement or a strong recommendation per `requireReference`.
4470
+ * - The set of paths the rule applies to.
4471
+ * - The optional lint script (cross-referenced only when emitted).
4472
+ *
4473
+ * When the convention is disabled, the rule renders a short stub.
4474
+ */
4475
+ declare function renderIssueTemplatesRuleContent(it: ResolvedIssueTemplates): string;
4476
+ /**
4477
+ * Render the short issue-templates hook section injected into a
4478
+ * phased-agent bundle's workflow rule. The section cites the full
4479
+ * contract documented in the base bundle's
4480
+ * `issue-templates-convention` rule so individual bundles stay DRY.
4481
+ *
4482
+ * When the convention is disabled, the function returns an empty
4483
+ * string so callers can no-op their append path.
4484
+ */
4485
+ declare function renderIssueTemplatesBundleHook(it: ResolvedIssueTemplates, bundleLabel: string): string;
4486
+ /**
4487
+ * Render a minimal starter issue-templates page — a top-level
4488
+ * heading, the "How to use" preamble, and a single example template
4489
+ * section. Exported so `AgentConfig` can emit it to disk when the
4490
+ * consumer opts in via `emitStarterDoc: true`.
4491
+ *
4492
+ * The starter is deliberately sparse: it documents the expected
4493
+ * structure without committing the consumer to a particular phase
4494
+ * label list. Repos that already maintain a hand-authored templates
4495
+ * page should leave `emitStarterDoc` off — the emission would
4496
+ * overwrite their content.
4497
+ */
4498
+ declare function renderIssueTemplatesStarterPage(_it: ResolvedIssueTemplates): string;
4499
+ /**
4500
+ * Render the `.claude/procedures/check-issue-templates.sh` helper
4501
+ * script. Exported so `AgentConfig` can register it as an
4502
+ * `AgentProcedure` when the consumer opts in via `emitChecker: true`.
4503
+ *
4504
+ * The script accepts the list of changed files as either:
4505
+ *
4506
+ * 1. Positional arguments (one file per arg).
4507
+ * 2. Newline-separated entries on stdin (when no args supplied) —
4508
+ * pipe `git diff --name-only` directly into it.
4509
+ *
4510
+ * It fails non-zero when any changed file matches a bundle-path
4511
+ * pattern and contains a multi-line `gh issue create ... --title`
4512
+ * invocation that isn't in the configured allow list (the templates
4513
+ * page itself and the `create-issue-workflow` rule source).
4514
+ */
4515
+ declare function renderIssueTemplatesCheckerScript(it: ResolvedIssueTemplates): string;
1878
4516
 
1879
4517
  /**
1880
- * Fully-resolved agent output-path roots. Every property is required.
4518
+ * Default master switch for the progress-file convention. When no
4519
+ * config is supplied, the convention ships **enabled** so every phased
4520
+ * agent writes a progress file on claim and reads it on resume.
1881
4521
  *
1882
- * This is the shape that bundle code consumes at module-eval time via
1883
- * `DEFAULT_AGENT_PATHS`, and the shape that `resolveAgentPaths()`
1884
- * returns when consumers supply a partial `AgentPathsConfig` override.
4522
+ * @see ProgressFilesConfig
1885
4523
  */
1886
- interface ResolvedAgentPaths {
1887
- readonly docsRoot: string;
1888
- readonly researchRoot: string;
1889
- readonly profilesRoot: string;
1890
- readonly meetingsRoot: string;
1891
- readonly requirementsRoot: string;
1892
- readonly researchRequirementsRoot: string;
1893
- readonly bcmRoot: string;
1894
- readonly peopleRoot: string;
1895
- readonly companiesRoot: string;
1896
- readonly softwareRoot: string;
1897
- readonly industriesRoot: string;
4524
+ declare const DEFAULT_PROGRESS_FILES_ENABLED = true;
4525
+ /**
4526
+ * Default on-disk root for progress files, relative to the repo root.
4527
+ * Every progress file resolves to
4528
+ * `<stateDir>/<filename>` where `<filename>` is produced from
4529
+ * `filenamePattern` at runtime.
4530
+ *
4531
+ * @see ProgressFilesConfig
4532
+ */
4533
+ declare const DEFAULT_PROGRESS_FILES_STATE_DIR = ".claude/state";
4534
+ /**
4535
+ * Default filename pattern for a progress file. The `<ISSUE_NUMBER>`
4536
+ * placeholder is substituted at runtime with the numeric id of the
4537
+ * issue the agent is working on (e.g. `479-progress.json`).
4538
+ *
4539
+ * The placeholder uses the angle-bracketed uppercase-snake form — not
4540
+ * `{{curly-brace}}` form — because `AgentConfig`'s template resolver
4541
+ * claims the curly-brace namespace at rule generation time.
4542
+ *
4543
+ * @see ProgressFilesConfig
4544
+ */
4545
+ declare const DEFAULT_PROGRESS_FILES_FILENAME_PATTERN = "<ISSUE_NUMBER>-progress.json";
4546
+ /**
4547
+ * Default serialization format for a progress file body. JSON is the
4548
+ * default because it is trivially machine-parseable (e.g. for scripted
4549
+ * resume logic) while still remaining human-readable when opened.
4550
+ * Consumers that prefer the openhi-style markdown body can override.
4551
+ *
4552
+ * @see ProgressFilesConfig
4553
+ */
4554
+ declare const DEFAULT_PROGRESS_FILES_FORMAT: "json" | "markdown";
4555
+ /**
4556
+ * Default stale-threshold (hours) for branches carrying a progress
4557
+ * file. When the orchestrator's stale-branch decision tree finds a
4558
+ * progress file older than this many hours **and** no matching open
4559
+ * PR, it treats the branch as abandoned and resets the issue to
4560
+ * `status:ready`. Mirrors the 72-hour in-progress threshold used by
4561
+ * the orchestrator bundle's triage walk.
4562
+ *
4563
+ * @see ProgressFilesConfig
4564
+ */
4565
+ declare const DEFAULT_PROGRESS_FILES_STALE_AFTER_HOURS = 72;
4566
+ /**
4567
+ * Allowed values for `ProgressFilesConfig.format`. Exported so
4568
+ * consumers can reference the canonical set without hard-coding
4569
+ * literals.
4570
+ */
4571
+ declare const PROGRESS_FILES_FORMAT_VALUES: readonly ["json", "markdown"];
4572
+ /**
4573
+ * Fully-resolved progress-file settings. Every field is defaulted so
4574
+ * downstream renderers can reason about a single canonical shape.
4575
+ */
4576
+ interface ResolvedProgressFiles {
4577
+ readonly enabled: boolean;
4578
+ readonly stateDir: string;
4579
+ readonly filenamePattern: string;
4580
+ readonly format: "json" | "markdown";
4581
+ readonly cleanupOnComplete: boolean;
4582
+ readonly staleAfterHours: number;
1898
4583
  }
1899
4584
  /**
1900
- * Canonical default values for every agent path. These mirror the
1901
- * hardcoded paths that bundles used before `AgentPathsConfig` existed,
1902
- * so `DEFAULT_AGENT_PATHS.*` can be substituted into bundle rule
1903
- * content at module-eval time without changing the generated
1904
- * `.claude/rules/*.md` snapshot.
4585
+ * Resolve a (possibly absent) `ProgressFilesConfig` into a canonical
4586
+ * `ResolvedProgressFiles` with every field filled in. Unset fields
4587
+ * cascade from their documented defaults.
1905
4588
  *
1906
- * Consumers override the defaults by passing an `AgentPathsConfig`
1907
- * through `AgentConfigOptions.paths` and resolving it with
1908
- * `resolveAgentPaths()`. Per-project propagation into bundle rule
1909
- * content is a follow-up this export is the first step: interface +
1910
- * resolver land in this PR; the `AgentConfig.resolveRules` wiring lands
1911
- * next.
4589
+ * Malformed configs empty / whitespace-only `stateDir`, absolute
4590
+ * `stateDir`, empty / whitespace-only `filenamePattern`, `filenamePattern`
4591
+ * missing the `<ISSUE_NUMBER>` placeholder, unknown `format` value,
4592
+ * non-positive `staleAfterHours`throw a descriptive `Error`.
1912
4593
  */
1913
- declare const DEFAULT_AGENT_PATHS: ResolvedAgentPaths;
4594
+ declare function resolveProgressFiles(config?: ProgressFilesConfig): ResolvedProgressFiles;
1914
4595
  /**
1915
- * Resolve a partial `AgentPathsConfig` into a fully-populated
1916
- * `ResolvedAgentPaths`. Unset fields cascade from their parent root:
4596
+ * Synth-time validation hook. Throws a descriptive `Error` when the
4597
+ * supplied `ProgressFilesConfig` is malformed. Called by
4598
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
4599
+ * convention fails the build instead of silently shipping broken
4600
+ * resume semantics. Returns the resolved config unchanged so callers
4601
+ * can write `const pf = validateProgressFilesConfig(config)` in
4602
+ * one line.
4603
+ *
4604
+ * Malformed cases rejected here:
4605
+ *
4606
+ * - `stateDir` empty, whitespace-only, or absolute.
4607
+ * - `filenamePattern` empty, whitespace-only, or missing the
4608
+ * `<ISSUE_NUMBER>` placeholder.
4609
+ * - `format` not one of `"json"` / `"markdown"`.
4610
+ * - `staleAfterHours` non-integer, zero, or negative.
4611
+ */
4612
+ declare function validateProgressFilesConfig(config?: ProgressFilesConfig): ResolvedProgressFiles;
4613
+ /**
4614
+ * Resolve the runtime filename for a progress file given an issue
4615
+ * number and a resolved config. `<ISSUE_NUMBER>` placeholders in the
4616
+ * pattern are substituted; the returned value is **just** the filename
4617
+ * (no directory prefix).
1917
4618
  *
1918
- * - `profilesRoot`, `meetingsRoot`, `requirementsRoot`, and `bcmRoot`
1919
- * derive from `docsRoot` when not explicitly set.
1920
- * - `researchRequirementsRoot` derives from `researchRoot` when not
1921
- * explicitly set.
1922
- * - `peopleRoot`, `companiesRoot`, `softwareRoot`, and `industriesRoot`
1923
- * derive from the resolved `profilesRoot` when not explicitly set,
1924
- * so that overriding `docsRoot` alone (or overriding `profilesRoot`
1925
- * alone) propagates correctly through every dependent root.
4619
+ * Exported so consumer-side scripts (or the `partial-resume-protocol`
4620
+ * rule renderer) can compute the on-disk path deterministically.
1926
4621
  */
1927
- declare function resolveAgentPaths(paths?: AgentPathsConfig): ResolvedAgentPaths;
1928
-
4622
+ declare function renderProgressFileName(pf: ResolvedProgressFiles, issueNumber: number | string): string;
1929
4623
  /**
1930
- * People-profile bundle enabled by default.
4624
+ * Resolve the runtime path (directory + filename) for a progress file
4625
+ * given an issue number and a resolved config.
4626
+ */
4627
+ declare function renderProgressFilePath(pf: ResolvedProgressFiles, issueNumber: number | string): string;
4628
+ /**
4629
+ * Render the full body for the `progress-file-convention` rule shipped
4630
+ * by the `base` bundle. The rule documents:
1931
4631
  *
1932
- * Consuming projects can disable it with
1933
- * `excludeBundles: ["people-profile"]`. `appliesWhen` always returns
1934
- * `true` per the operating-system directive that bundles assume peers
1935
- * are present in Phase 3 this bundle hands work off to
1936
- * `company-profile` (via `company:research`) and `software-profile`
1937
- * (via `software:research`).
4632
+ * - The progress-file schema and on-disk path contract.
4633
+ * - The partial-resume protocol (read-before-write + acceptance
4634
+ * criteria replay).
4635
+ * - The stale-branch decision tree (clone-level recovery) that every
4636
+ * worker runs at session start.
4637
+ * - The `[BLOCKED]` structured comment format used when an agent
4638
+ * cannot proceed.
1938
4639
  *
1939
- * Ships a sub-agent (`people-profile-analyst`), two user-invocable
1940
- * skills (`/profile-person`, `/refresh-person`), and `type:people-profile`
1941
- * plus `people:*` phase labels for the four phases.
4640
+ * When the convention is disabled, the rule renders a short stub that
4641
+ * tells agents the project does not enforce progress files and they
4642
+ * must pick up work from scratch on every session.
1942
4643
  */
1943
- declare const peopleProfileBundle: AgentRuleBundle;
1944
-
4644
+ declare function renderProgressFilesRuleContent(pf: ResolvedProgressFiles): string;
1945
4645
  /**
1946
- * PNPM bundle auto-detected when the PnpmWorkspace component is present.
4646
+ * Render the short progress-file hook section injected into a
4647
+ * phased-agent bundle's workflow rule (bcm-writer, research-pipeline,
4648
+ * etc.). The section cites the full contract documented in the base
4649
+ * bundle's `progress-file-convention` rule so individual bundles stay
4650
+ * DRY.
4651
+ *
4652
+ * When the convention is disabled, the function returns an empty
4653
+ * string so callers can no-op their append path.
1947
4654
  */
1948
- declare const pnpmBundle: AgentRuleBundle;
4655
+ declare function renderProgressFilesBundleHook(pf: ResolvedProgressFiles, bundleLabel: string): string;
1949
4656
 
1950
4657
  /*******************************************************************************
1951
4658
  *
@@ -1961,6 +4668,36 @@ declare const prReviewBundle: AgentRuleBundle;
1961
4668
  */
1962
4669
  declare const projenBundle: AgentRuleBundle;
1963
4670
 
4671
+ /**
4672
+ * Regulatory-research bundle — enabled by default.
4673
+ *
4674
+ * Consuming projects can disable it with
4675
+ * `excludeBundles: ["regulatory-research"]`. `appliesWhen` always
4676
+ * returns `true` per the workflow-bundle peer-present assumption.
4677
+ *
4678
+ * Ships a sub-agent (`regulatory-research-analyst`), three
4679
+ * user-invocable skills (`/scan-regulatory-landscape`,
4680
+ * `/research-regulation`, `/impact-regulation`), a regulation-page
4681
+ * template (emitted alongside the research skill), and
4682
+ * `type:regulatory-research` plus `regulatory:*` phase labels.
4683
+ *
4684
+ * The bundle sits downstream of `research-pipeline`,
4685
+ * `industry-discovery`, and `standards-research` (which surface the
4686
+ * need for regulatory research) and hands off actionable obligations
4687
+ * to the `requirements-analyst` bundle via `req:scan` issues that
4688
+ * become SEC (security & compliance) requirements in the writer
4689
+ * pipeline, and canonical profiles to `company-profile` and
4690
+ * `people-profile` for enforcement bodies and regulatory leaders.
4691
+ */
4692
+ declare function buildRegulatoryResearchBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
4693
+ /**
4694
+ * Default-paths instance of the regulatory-research bundle, preserved
4695
+ * for backward compatibility with consumers that import the const
4696
+ * directly. The factory above is the canonical entry point when a
4697
+ * consumer supplies `AgentConfigOptions.paths`.
4698
+ */
4699
+ declare const regulatoryResearchBundle: AgentRuleBundle;
4700
+
1964
4701
  /**
1965
4702
  * Inject domain-specific source-tier examples into the content of the
1966
4703
  * base bundle's "Source Quality & Verification" rule.
@@ -2060,15 +4797,481 @@ declare function renderMeetingTypesSection(meetings: MeetingsConfig | undefined)
2060
4797
  declare function renderPriorityRulesSection(rules: ReadonlyArray<PriorityRule>): string;
2061
4798
 
2062
4799
  /**
2063
- * Requirements-analyst bundle opt-in via `includeBundles: [\"requirements-analyst\"]`.
4800
+ * Default master switch for the shared-editing convention. When no
4801
+ * config is supplied, the convention ships **enabled** so every agent
4802
+ * that edits an index file follows the single-entry / verify /
4803
+ * re-sort protocol.
4804
+ *
4805
+ * @see SharedEditingConfig
4806
+ */
4807
+ declare const DEFAULT_SHARED_EDITING_ENABLED = true;
4808
+ /**
4809
+ * Default list of path patterns considered "shared index files". The
4810
+ * patterns are plain glob strings rendered verbatim into the rule body
4811
+ * — agents match against them when deciding whether the shared-editing
4812
+ * contract applies to the file they are about to edit.
4813
+ *
4814
+ * The defaults cover the registry / index files every configulator
4815
+ * consumer ships by convention:
4816
+ *
4817
+ * - A monorepo-wide docs site at `/docs` with one or more `index.md` /
4818
+ * `README.md` registry tables.
4819
+ * - Category landing pages under `docs/src/content/docs/**` that list
4820
+ * every profile, requirement, or capability in their category.
4821
+ * - Feature matrices produced by the `software-profile` bundle.
4822
+ *
4823
+ * Consumers can replace the list outright via `sharedIndexPaths` or
4824
+ * append project-specific registries.
4825
+ *
4826
+ * @see SharedEditingConfig
4827
+ */
4828
+ declare const DEFAULT_SHARED_INDEX_PATHS: ReadonlyArray<string>;
4829
+ /**
4830
+ * Default conflict-resolution strategy rendered into the rule body.
4831
+ * `rebase` matches the `git pull --rebase` workflow every
4832
+ * configulator-managed repo already uses for feature branches; the
4833
+ * alternative (`merge`) is documented for projects that keep a
4834
+ * merge-commit-only history.
4835
+ *
4836
+ * @see SharedEditingConfig
4837
+ */
4838
+ declare const DEFAULT_SHARED_EDITING_CONFLICT_STRATEGY: "rebase" | "merge";
4839
+ /**
4840
+ * Default for whether the convention renders the commit-path
4841
+ * verification protocol (read-back + single-row assertion). The
4842
+ * verification step is cheap, catches staging / path bugs that would
4843
+ * otherwise land on the branch, and is the core safety net the openhi
4844
+ * reference promotes — so it ships **on** by default.
4845
+ *
4846
+ * @see SharedEditingConfig
4847
+ */
4848
+ declare const DEFAULT_SHARED_EDITING_VERIFY_COMMIT = true;
4849
+ /**
4850
+ * Default for whether the convention emits the
4851
+ * `.claude/procedures/verify-index-row.sh` helper to disk. The helper
4852
+ * is opt-in because many consumers prefer to do the verification
4853
+ * inline via the documented `git show HEAD:<path>` recipe rather than
4854
+ * shell out to a dedicated script. Consumers that want the script
4855
+ * available to sub-agents enable the emission explicitly.
4856
+ *
4857
+ * @see SharedEditingConfig
4858
+ */
4859
+ declare const DEFAULT_SHARED_EDITING_EMIT_HELPER = false;
4860
+ /**
4861
+ * Allowed values for `SharedEditingConfig.conflictStrategy`. Exported
4862
+ * so consumers can reference the canonical set without hard-coding
4863
+ * literals.
4864
+ */
4865
+ declare const SHARED_EDITING_CONFLICT_STRATEGY_VALUES: readonly ["rebase", "merge"];
4866
+ /**
4867
+ * Fully-resolved shared-editing settings. Every field is defaulted so
4868
+ * downstream renderers can reason about a single canonical shape.
4869
+ */
4870
+ interface ResolvedSharedEditing {
4871
+ readonly enabled: boolean;
4872
+ readonly sharedIndexPaths: ReadonlyArray<string>;
4873
+ readonly verifyCommit: boolean;
4874
+ readonly conflictStrategy: "rebase" | "merge";
4875
+ readonly emitHelper: boolean;
4876
+ }
4877
+ /**
4878
+ * Resolve a (possibly absent) `SharedEditingConfig` into a canonical
4879
+ * `ResolvedSharedEditing` with every field filled in. Unset fields
4880
+ * cascade from their documented defaults.
4881
+ *
4882
+ * Malformed configs — empty / whitespace-only `sharedIndexPaths`
4883
+ * entry, unknown `conflictStrategy` — throw a descriptive `Error`.
4884
+ */
4885
+ declare function resolveSharedEditing(config?: SharedEditingConfig): ResolvedSharedEditing;
4886
+ /**
4887
+ * Synth-time validation hook. Throws a descriptive `Error` when the
4888
+ * supplied `SharedEditingConfig` is malformed. Called by
4889
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
4890
+ * convention fails the build instead of silently shipping broken
4891
+ * shared-editing guidance. Returns the resolved config unchanged so
4892
+ * callers can write `const se = validateSharedEditingConfig(config)`
4893
+ * in one line.
4894
+ *
4895
+ * Malformed cases rejected here:
4896
+ *
4897
+ * - `sharedIndexPaths` contains an empty / whitespace-only entry, or
4898
+ * the array is supplied but empty.
4899
+ * - `conflictStrategy` is not one of `"rebase"` / `"merge"`.
4900
+ */
4901
+ declare function validateSharedEditingConfig(config?: SharedEditingConfig): ResolvedSharedEditing;
4902
+ /**
4903
+ * Render the full body for the `shared-editing-safety` rule shipped
4904
+ * by the `base` bundle. The rule documents:
4905
+ *
4906
+ * - The catalog of shared index files the contract applies to.
4907
+ * - The pre-edit read-latest protocol (pull + re-read before editing).
4908
+ * - The single-entry, deterministic-sort row-insert rule.
4909
+ * - The commit-path verification step (read-back + count assertion).
4910
+ * - The merge-conflict resolution recipe (rebase, re-sort, re-verify).
4911
+ *
4912
+ * When the convention is disabled, the rule renders a short stub that
4913
+ * tells agents the project does not enforce the convention and that
4914
+ * concurrent edits to shared index files may require manual conflict
4915
+ * resolution.
4916
+ */
4917
+ declare function renderSharedEditingRuleContent(se: ResolvedSharedEditing): string;
4918
+ /**
4919
+ * Render the short shared-editing hook section injected into a
4920
+ * phased-agent bundle's workflow rule (company-profile,
4921
+ * people-profile, software-profile, etc.). The section cites the
4922
+ * full contract documented in the base bundle's
4923
+ * `shared-editing-safety` rule so individual bundles stay DRY.
4924
+ *
4925
+ * When the convention is disabled, the function returns an empty
4926
+ * string so callers can no-op their append path.
4927
+ */
4928
+ declare function renderSharedEditingBundleHook(se: ResolvedSharedEditing, bundleLabel: string): string;
4929
+ /**
4930
+ * Render the `.claude/procedures/verify-index-row.sh` helper script.
4931
+ * Exported so `AgentConfig` can register it as an `AgentProcedure`
4932
+ * when the consumer opts in via `emitHelper: true`.
4933
+ *
4934
+ * The script takes two positional arguments:
4935
+ *
4936
+ * 1. `<index-path>` — repo-relative path to the shared index file.
4937
+ * 2. `<row-unique-marker>` — substring unique to the new row.
4938
+ *
4939
+ * It exits non-zero on any of the following:
4940
+ *
4941
+ * - Wrong argument count.
4942
+ * - Index file is not present in `HEAD` (i.e. not staged).
4943
+ * - The unique-marker substring appears zero times (row missing)
4944
+ * or more than once (duplicate row from a mis-merged conflict).
4945
+ */
4946
+ declare function renderSharedEditingHelperScript(_se: ResolvedSharedEditing): string;
4947
+
4948
+ /**
4949
+ * Default master switch for the skill-eval harness convention. When no
4950
+ * config is supplied, the convention ships **enabled** so every skill
4951
+ * that ships an `evals/evals.json` file has a documented schema,
4952
+ * runner entry-point, and product-context injection contract.
4953
+ *
4954
+ * @see SkillEvalsConfig
4955
+ */
4956
+ declare const DEFAULT_SKILL_EVALS_ENABLED = true;
4957
+ /**
4958
+ * Default root directory (relative to the repo root) that holds every
4959
+ * skill's SKILL.md. The harness contract says that any skill SKILL.md
4960
+ * under this root may ship an `evals/evals.json` file alongside it —
4961
+ * the runner discovers eval suites by walking
4962
+ * `<skillsRoot>/<skill-name>/evals/evals.json`.
4963
+ *
4964
+ * Defaults to `.claude/skills`, which matches the location every
4965
+ * configulator-managed project ships skills to on disk.
4966
+ *
4967
+ * @see SkillEvalsConfig
4968
+ */
4969
+ declare const DEFAULT_SKILL_EVALS_SKILLS_ROOT = ".claude/skills";
4970
+ /**
4971
+ * Default path to the product-context fixture consumed by every eval
4972
+ * suite. Configulator ships with a `docs/src/content/docs/project-context.md`
4973
+ * file that every agent already loads at session start; the eval harness
4974
+ * re-uses that file so eval prompts are parameterised by the consuming
4975
+ * project's domain vocabulary, in-scope capabilities, and stakeholders
4976
+ * without the evals needing per-project forks.
4977
+ *
4978
+ * @see SkillEvalsConfig
4979
+ */
4980
+ declare const DEFAULT_PRODUCT_CONTEXT_PATH = "docs/src/content/docs/project-context.md";
4981
+ /**
4982
+ * Default policy for whether the harness should **require** a
4983
+ * product-context file to be present before running the suite.
4984
+ *
4985
+ * `true` (default) — the runner fails fast when the file is missing,
4986
+ * because an eval that silently runs without its product-context
4987
+ * fixture is a false-positive waiting to happen.
4988
+ *
4989
+ * `false` — the runner emits a warning to stderr but still runs the
4990
+ * suite. Useful for bootstrapping a new consuming repo that has not
4991
+ * yet authored its `project-context.md`.
4992
+ *
4993
+ * @see SkillEvalsConfig
4994
+ */
4995
+ declare const DEFAULT_REQUIRE_PRODUCT_CONTEXT = true;
4996
+ /**
4997
+ * Default for whether the convention emits the
4998
+ * `.claude/procedures/run-skill-evals.sh` helper to disk. The helper
4999
+ * is opt-in because many consumers run evals from CI or ad-hoc from
5000
+ * their own scripts rather than through the bundled harness; consumers
5001
+ * who want a ready-to-invoke runner flip this to `true`.
5002
+ *
5003
+ * @see SkillEvalsConfig
5004
+ */
5005
+ declare const DEFAULT_SKILL_EVALS_EMIT_RUNNER = false;
5006
+ /**
5007
+ * Fully-resolved skill-evals settings. Every field is defaulted so
5008
+ * downstream renderers can reason about a single canonical shape.
5009
+ */
5010
+ interface ResolvedSkillEvals {
5011
+ readonly enabled: boolean;
5012
+ readonly skillsRoot: string;
5013
+ readonly productContextPath: string;
5014
+ readonly requireProductContext: boolean;
5015
+ readonly emitRunner: boolean;
5016
+ }
5017
+ /**
5018
+ * Resolve a (possibly absent) `SkillEvalsConfig` into a canonical
5019
+ * `ResolvedSkillEvals` with every field filled in. Unset fields
5020
+ * cascade from their documented defaults.
5021
+ *
5022
+ * Malformed configs — empty / whitespace-only or absolute `skillsRoot`,
5023
+ * empty / whitespace-only or absolute `productContextPath` — throw a
5024
+ * descriptive `Error`.
5025
+ */
5026
+ declare function resolveSkillEvals(config?: SkillEvalsConfig): ResolvedSkillEvals;
5027
+ /**
5028
+ * Synth-time validation hook. Throws a descriptive `Error` when the
5029
+ * supplied `SkillEvalsConfig` is malformed. Called by
5030
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
5031
+ * convention fails the build instead of silently shipping a broken
5032
+ * eval harness. Returns the resolved config unchanged so callers can
5033
+ * write `const se = validateSkillEvalsConfig(config)` in one line.
5034
+ *
5035
+ * Malformed cases rejected here:
5036
+ *
5037
+ * - `skillsRoot` empty, whitespace-only, or absolute.
5038
+ * - `productContextPath` empty, whitespace-only, or absolute.
5039
+ */
5040
+ declare function validateSkillEvalsConfig(config?: SkillEvalsConfig): ResolvedSkillEvals;
5041
+ /**
5042
+ * Render the full body for the `skill-evals` rule shipped by the
5043
+ * `base` bundle. The rule documents:
5044
+ *
5045
+ * - The on-disk contract (where `evals/evals.json` lives).
5046
+ * - The JSON schema every eval file follows.
5047
+ * - The product-context injection protocol (how evals reference and
5048
+ * interpolate the repo's `project-context.md` without forking).
5049
+ * - The runner entry-point (`run-skill-evals.sh` when opted in, or
5050
+ * the inline `jq`-driven recipe when not).
5051
+ *
5052
+ * When the convention is disabled, the rule renders a short stub that
5053
+ * tells agents the project does not ship skill evals and that skill
5054
+ * changes ride on review alone.
5055
+ */
5056
+ declare function renderSkillEvalsRuleContent(se: ResolvedSkillEvals): string;
5057
+ /**
5058
+ * Render the short skill-evals hook section injected into a skill's
5059
+ * owning bundle rule (requirements-writer, bcm-writer, etc.). The
5060
+ * section cites the full contract documented in the base bundle's
5061
+ * `skill-evals` rule so individual bundles stay DRY.
5062
+ *
5063
+ * When the convention is disabled, the function returns an empty
5064
+ * string so callers can no-op their append path.
5065
+ */
5066
+ declare function renderSkillEvalsBundleHook(se: ResolvedSkillEvals, skillLabel: string): string;
5067
+ /**
5068
+ * Render the `.claude/procedures/run-skill-evals.sh` helper script.
5069
+ * Exported so `AgentConfig` can register it as an `AgentProcedure`
5070
+ * when the consumer opts in via `emitRunner: true`.
5071
+ *
5072
+ * The script takes zero or one positional arguments:
5073
+ *
5074
+ * 1. `[<skill-name>]` — optional, restricts the run to one skill.
5075
+ *
5076
+ * It exits non-zero on any of the following:
5077
+ *
5078
+ * - `jq` is not available on `PATH`.
5079
+ * - A discovered `evals.json` is malformed or missing required fields.
5080
+ * - `skill_name` inside the file does not match the parent directory.
5081
+ * - The product-context fixture is missing and `requireProductContext`
5082
+ * is `true` in the resolved config.
5083
+ */
5084
+ declare function renderSkillEvalsRunnerScript(se: ResolvedSkillEvals): string;
5085
+
5086
+ /**
5087
+ * Default master switch for the workflow-diagrams convention. When no
5088
+ * config is supplied the convention ships **enabled** so every
5089
+ * configulator-consuming repo carries the "diagram-touched-when-bundle-
5090
+ * touched" rule in its rendered `CLAUDE.md`.
5091
+ *
5092
+ * @see WorkflowDiagramsConfig
5093
+ */
5094
+ declare const DEFAULT_WORKFLOW_DIAGRAMS_ENABLED = true;
5095
+ /**
5096
+ * Default repo-relative path for the workflow-diagrams page. Matches
5097
+ * the singleton `/docs` site layout the monorepo contract assumes: a
5098
+ * single Starlight docs site at `/docs` with sub-project agent pages
5099
+ * under `docs/src/content/docs/agents/`.
5100
+ *
5101
+ * The file is never generated by configulator (the convention is
5102
+ * explicit: diagrams are hand-authored for readability). Consumers
5103
+ * opt into the starter stub via `emitStarterDiagram: true`.
5104
+ *
5105
+ * @see WorkflowDiagramsConfig
5106
+ */
5107
+ declare const DEFAULT_WORKFLOW_DIAGRAMS_PATH = "docs/src/content/docs/agents/workflows.md";
5108
+ /**
5109
+ * Default list of glob patterns that identify "bundle files" — the
5110
+ * source files whose edits require the workflow-diagrams page to be
5111
+ * touched in the same change set.
5112
+ *
5113
+ * The defaults cover the two canonical locations bundle-like content
5114
+ * lives in a configulator-consuming repo:
5115
+ *
5116
+ * - `packages/@codedrifters/configulator/src/agent/bundles/**.ts` —
5117
+ * the bundle authoring sites inside configulator itself.
5118
+ * - `.claude/agents/**.md` / `.claude/skills/**` — agent and skill
5119
+ * prompts in consuming repos that don't re-export configulator
5120
+ * bundles.
5121
+ *
5122
+ * Consumers can replace the list outright via `bundlePathPatterns`
5123
+ * when their agent sources live elsewhere (e.g. a monorepo that keeps
5124
+ * agents under `tools/agents/`).
5125
+ *
5126
+ * @see WorkflowDiagramsConfig
5127
+ */
5128
+ declare const DEFAULT_WORKFLOW_DIAGRAMS_BUNDLE_PATH_PATTERNS: ReadonlyArray<string>;
5129
+ /**
5130
+ * Default for whether the convention emits a starter workflow-diagrams
5131
+ * page to disk at `<diagramsPath>`. Disabled by default because the
5132
+ * page is hand-authored — an emitted stub would conflict with
5133
+ * existing content on repos adopting the convention late.
5134
+ *
5135
+ * @see WorkflowDiagramsConfig
5136
+ */
5137
+ declare const DEFAULT_WORKFLOW_DIAGRAMS_EMIT_STARTER = false;
5138
+ /**
5139
+ * Default for whether the convention emits the
5140
+ * `.claude/procedures/check-workflow-diagrams.sh` checker script. The
5141
+ * script walks the staged / changed-file set and fails when a bundle
5142
+ * file is touched without the diagrams page being touched too.
5143
+ *
5144
+ * Disabled by default because many consumers prefer to enforce the
5145
+ * rule via review discipline and the rendered documentation alone;
5146
+ * the script is opt-in for repos that want a hard CI gate or
5147
+ * pre-commit hook.
5148
+ *
5149
+ * @see WorkflowDiagramsConfig
5150
+ */
5151
+ declare const DEFAULT_WORKFLOW_DIAGRAMS_EMIT_CHECKER = false;
5152
+ /**
5153
+ * Default for whether the rendered rule body asserts the diagram
5154
+ * update as a **hard requirement** vs. a **strong recommendation**.
5155
+ * Defaults to `true` — the whole point of the convention is that
5156
+ * diagrams stay in sync, so the hard-requirement phrasing is the
5157
+ * correct default. Consumers that treat diagrams as aspirational can
5158
+ * soften the phrasing by setting this to `false`.
5159
+ *
5160
+ * @see WorkflowDiagramsConfig
5161
+ */
5162
+ declare const DEFAULT_WORKFLOW_DIAGRAMS_REQUIRE_UPDATE = true;
5163
+ /**
5164
+ * Fully-resolved workflow-diagrams settings. Every field is defaulted
5165
+ * so downstream renderers can reason about a single canonical shape.
5166
+ */
5167
+ interface ResolvedWorkflowDiagrams {
5168
+ readonly enabled: boolean;
5169
+ readonly diagramsPath: string;
5170
+ readonly bundlePathPatterns: ReadonlyArray<string>;
5171
+ readonly emitStarterDiagram: boolean;
5172
+ readonly emitChecker: boolean;
5173
+ readonly requireDiagramUpdate: boolean;
5174
+ }
5175
+ /**
5176
+ * Resolve a (possibly absent) `WorkflowDiagramsConfig` into a
5177
+ * canonical `ResolvedWorkflowDiagrams` with every field filled in.
5178
+ * Unset fields cascade from their documented defaults.
5179
+ *
5180
+ * Malformed configs — empty / whitespace-only or absolute
5181
+ * `diagramsPath`, empty `bundlePathPatterns`, empty /
5182
+ * whitespace-only path entry — throw a descriptive `Error`.
5183
+ */
5184
+ declare function resolveWorkflowDiagrams(config?: WorkflowDiagramsConfig): ResolvedWorkflowDiagrams;
5185
+ /**
5186
+ * Synth-time validation hook. Throws a descriptive `Error` when the
5187
+ * supplied `WorkflowDiagramsConfig` is malformed. Called by
5188
+ * `AgentConfig.preSynthesize` before any rendering so a misconfigured
5189
+ * convention fails the build instead of silently shipping broken
5190
+ * workflow-diagrams guidance. Returns the resolved config unchanged
5191
+ * so callers can write
5192
+ * `const wd = validateWorkflowDiagramsConfig(config)` in one line.
5193
+ *
5194
+ * Malformed cases rejected here:
5195
+ *
5196
+ * - `diagramsPath` empty, whitespace-only, or absolute.
5197
+ * - `bundlePathPatterns` not an array, empty, or contains an empty /
5198
+ * whitespace-only entry.
5199
+ */
5200
+ declare function validateWorkflowDiagramsConfig(config?: WorkflowDiagramsConfig): ResolvedWorkflowDiagrams;
5201
+ /**
5202
+ * Render the full body for the `workflow-diagrams-convention` rule
5203
+ * shipped by the `base` bundle. The rule documents:
5204
+ *
5205
+ * - Why the convention exists (diagram / prose drift).
5206
+ * - The on-disk contract — a single Mermaid-based page at
5207
+ * `<diagramsPath>` with one diagram per agent + a master
5208
+ * cross-agent diagram.
5209
+ * - The **diagram-touched-when-bundle-touched** rule, phrased as a
5210
+ * hard requirement or a strong recommendation per
5211
+ * `requireDiagramUpdate`.
5212
+ * - The set of paths the rule applies to.
5213
+ * - The optional checker script (cross-referenced only when emitted).
5214
+ *
5215
+ * When the convention is disabled, the rule renders a short stub.
5216
+ */
5217
+ declare function renderWorkflowDiagramsRuleContent(wd: ResolvedWorkflowDiagrams): string;
5218
+ /**
5219
+ * Render the short workflow-diagrams hook section injected into a
5220
+ * phased-agent bundle's workflow rule. The section cites the full
5221
+ * contract documented in the base bundle's
5222
+ * `workflow-diagrams-convention` rule so individual bundles stay DRY.
5223
+ *
5224
+ * When the convention is disabled, the function returns an empty
5225
+ * string so callers can no-op their append path.
5226
+ */
5227
+ declare function renderWorkflowDiagramsBundleHook(wd: ResolvedWorkflowDiagrams, bundleLabel: string): string;
5228
+ /**
5229
+ * Render a minimal starter workflow-diagrams page — a top-level
5230
+ * heading, the master-diagram placeholder, and a single example
5231
+ * agent section. Exported so `AgentConfig` can emit it to disk when
5232
+ * the consumer opts in via `emitStarterDiagram: true`.
5233
+ *
5234
+ * The starter is deliberately sparse: it documents the expected
5235
+ * structure without committing the consumer to a particular agent
5236
+ * list. Repos that already maintain a hand-authored diagrams page
5237
+ * should leave `emitStarterDiagram` off — the emission would
5238
+ * overwrite their content.
5239
+ */
5240
+ declare function renderWorkflowDiagramsStarterPage(_wd: ResolvedWorkflowDiagrams): string;
5241
+ /**
5242
+ * Render the `.claude/procedures/check-workflow-diagrams.sh` helper
5243
+ * script. Exported so `AgentConfig` can register it as an
5244
+ * `AgentProcedure` when the consumer opts in via `emitChecker: true`.
5245
+ *
5246
+ * The script accepts the list of changed files as either:
5247
+ *
5248
+ * 1. Positional arguments (one file per arg).
5249
+ * 2. Newline-separated entries on stdin (when no args supplied) —
5250
+ * pipe `git diff --name-only` directly into it.
5251
+ *
5252
+ * It fails non-zero when any changed file matches a bundle-path
5253
+ * pattern and the configured diagrams path is not also in the list.
5254
+ * It exits `0` when no bundle files were touched or when the
5255
+ * diagrams page was touched alongside them.
5256
+ */
5257
+ declare function renderWorkflowDiagramsCheckerScript(wd: ResolvedWorkflowDiagrams): string;
5258
+
5259
+ /**
5260
+ * Build the requirements-analyst bundle with the supplied resolved
5261
+ * paths.
2064
5262
  *
2065
- * Provides a 2-phase requirements gap-discovery pipeline
2066
- * (scan draft-trace) designed for projects using the BCM (Business
2067
- * Capability Model) framework. Ships a sub-agent, a user-invocable
2068
- * skill, and `req:*` phase labels via the bundle `labels` mechanism so
2069
- * consuming projects automatically pick up the label taxonomy through
2070
- * the sync-labels workflow. See ADR-009 for the rationale behind
2071
- * collapsing the draft and trace phases.
5263
+ * Every reference to a canonical agent path (docs root, requirements
5264
+ * root, bcm root, etc.) inside the rule / skill / sub-agent content
5265
+ * strings is an interpolation of the supplied `paths` struct, so a
5266
+ * consumer override of `AgentConfigOptions.paths` propagates to the
5267
+ * rendered output.
5268
+ */
5269
+ declare function buildRequirementsAnalystBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
5270
+ /**
5271
+ * Default-paths instance of the requirements-analyst bundle, preserved
5272
+ * for backward compatibility with consumers that import the const
5273
+ * directly. The factory above is the canonical entry point when a
5274
+ * consumer supplies `AgentConfigOptions.paths`.
2072
5275
  */
2073
5276
  declare const requirementsAnalystBundle: AgentRuleBundle;
2074
5277
 
@@ -2103,6 +5306,13 @@ declare const requirementsAnalystBundle: AgentRuleBundle;
2103
5306
  * phase label so they share the same queue and triage flow as the
2104
5307
  * rest of the requirements pipeline.
2105
5308
  */
5309
+ declare function buildRequirementsReviewerBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
5310
+ /**
5311
+ * Default-paths instance of the requirements-reviewer bundle, preserved
5312
+ * for backward compatibility with consumers that import the const
5313
+ * directly. The factory above is the canonical entry point when a
5314
+ * consumer supplies `AgentConfigOptions.paths`.
5315
+ */
2106
5316
  declare const requirementsReviewerBundle: AgentRuleBundle;
2107
5317
 
2108
5318
  /**
@@ -2139,18 +5349,29 @@ declare const REQUIREMENTS_WRITER_PATHS: {
2139
5349
  * `type:requirement` is intentionally **not** declared here — it is
2140
5350
  * already declared by the `requirements-analyst` bundle and reused.
2141
5351
  */
5352
+ declare function buildRequirementsWriterBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
5353
+ /**
5354
+ * Default-paths instance of the requirements-writer bundle, preserved
5355
+ * for backward compatibility with consumers that import the const
5356
+ * directly. The factory above is the canonical entry point when a
5357
+ * consumer supplies `AgentConfigOptions.paths`.
5358
+ */
2142
5359
  declare const requirementsWriterBundle: AgentRuleBundle;
2143
5360
 
2144
5361
  /**
2145
- * Research-pipeline bundle enabled by default.
2146
- *
2147
- * Consuming projects can disable it with
2148
- * `excludeBundles: ["research-pipeline"]`. `appliesWhen` always returns
2149
- * `true` per this batch's directive that bundles assume peers are
2150
- * present.
5362
+ * Build the research-pipeline bundle with the supplied resolved paths.
2151
5363
  *
2152
- * Ships a sub-agent (`research-analyst`), a user-invocable skill
2153
- * (`/research`), and `type:research` plus `research:*` phase labels.
5364
+ * Every reference to a canonical agent path (research root, docs root,
5365
+ * etc.) inside the rule / skill / sub-agent content strings is an
5366
+ * interpolation of the supplied `paths` struct, so a consumer override
5367
+ * of `AgentConfigOptions.paths` propagates to the rendered output.
5368
+ */
5369
+ declare function buildResearchPipelineBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
5370
+ /**
5371
+ * Default-paths instance of the research-pipeline bundle, preserved
5372
+ * for backward compatibility with consumers that import the const
5373
+ * directly. The factory above is the canonical entry point when a
5374
+ * consumer supplies `AgentConfigOptions.paths`.
2154
5375
  */
2155
5376
  declare const researchPipelineBundle: AgentRuleBundle;
2156
5377
 
@@ -2168,6 +5389,13 @@ declare const researchPipelineBundle: AgentRuleBundle;
2168
5389
  declare const slackBundle: AgentRuleBundle;
2169
5390
 
2170
5391
  /**
5392
+ * Build the software-profile bundle with the supplied resolved paths.
5393
+ *
5394
+ * Every reference to a canonical agent path (docs root, bcm root)
5395
+ * inside the rule / skill / sub-agent content strings is an
5396
+ * interpolation of the supplied `paths` struct, so a consumer override
5397
+ * of `AgentConfigOptions.paths` propagates to the rendered output.
5398
+ *
2171
5399
  * Software-profile bundle — enabled by default.
2172
5400
  *
2173
5401
  * Consuming projects can disable it with
@@ -2182,8 +5410,49 @@ declare const slackBundle: AgentRuleBundle;
2182
5410
  * skills (`/profile-software` and `/map-software`), and
2183
5411
  * `type:software-profile` plus `software:*` phase labels.
2184
5412
  */
5413
+ declare function buildSoftwareProfileBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
5414
+ /**
5415
+ * Default-paths instance of the software-profile bundle, preserved
5416
+ * for backward compatibility with consumers that import the const
5417
+ * directly. The factory above is the canonical entry point when a
5418
+ * consumer supplies `AgentConfigOptions.paths`.
5419
+ */
2185
5420
  declare const softwareProfileBundle: AgentRuleBundle;
2186
5421
 
5422
+ /**
5423
+ * Build the standards-research bundle with the supplied resolved paths.
5424
+ *
5425
+ * Every reference to a canonical agent path (docs root, research root,
5426
+ * etc.) inside the rule / skill / sub-agent content strings is an
5427
+ * interpolation of the supplied `paths` struct, so a consumer override
5428
+ * of `AgentConfigOptions.paths` propagates to the rendered output.
5429
+ *
5430
+ * Consuming projects can disable it with
5431
+ * `excludeBundles: ["standards-research"]`. `appliesWhen` always
5432
+ * returns `true` per the workflow-bundle peer-present assumption.
5433
+ *
5434
+ * Ships a sub-agent (`standards-research-analyst`), five user-invocable
5435
+ * skills (`/scope-standards-research`, `/research-standard`,
5436
+ * `/compare-standards`, `/extension-standard`,
5437
+ * `/organizations-standard`), a comparison-grid template (emitted
5438
+ * alongside the compare skill), and `type:standards-research` plus
5439
+ * `standards:*` phase labels.
5440
+ *
5441
+ * The bundle sits downstream of `research-pipeline` and
5442
+ * `industry-discovery` (which surface the need for standards research)
5443
+ * and hands off canonical profiles to `company-profile` and
5444
+ * `people-profile`, extension ADRs to `requirements-writer`, and
5445
+ * domain-entity mappings to `bcm-writer`.
5446
+ */
5447
+ declare function buildStandardsResearchBundle(paths?: ResolvedAgentPaths): AgentRuleBundle;
5448
+ /**
5449
+ * Default-paths instance of the standards-research bundle, preserved
5450
+ * for backward compatibility with consumers that import the const
5451
+ * directly. The factory above is the canonical entry point when a
5452
+ * consumer supplies `AgentConfigOptions.paths`.
5453
+ */
5454
+ declare const standardsResearchBundle: AgentRuleBundle;
5455
+
2187
5456
  /**
2188
5457
  * Turborepo bundle — auto-detected when the TurboRepo component is present.
2189
5458
  */
@@ -2200,13 +5469,26 @@ declare const typescriptBundle: AgentRuleBundle;
2200
5469
  declare const vitestBundle: AgentRuleBundle;
2201
5470
 
2202
5471
  /**
2203
- * Built-in rule bundles that ship with configulator.
2204
- * Each bundle is auto-detected based on project introspection.
5472
+ * Build the full list of built-in rule bundles with the supplied
5473
+ * resolved agent paths. Every path-aware bundle accepts a
5474
+ * `ResolvedAgentPaths` and threads it through its rule / skill /
5475
+ * sub-agent content, so a consumer override of
5476
+ * `AgentConfigOptions.paths` propagates into the rendered output.
2205
5477
  *
2206
5478
  * Order matters: base is first so its rules can be overridden by
2207
5479
  * more specific bundles. The base bundle's `appliesWhen` always
2208
5480
  * returns true; it is filtered by the `includeBaseRules` option
2209
5481
  * in AgentConfig.
5482
+ *
5483
+ * Bundles that do not read any agent path (typescript, jest,
5484
+ * pnpm, etc.) stay as const exports and are referenced unchanged.
5485
+ */
5486
+ declare function buildBuiltInBundles(paths?: ResolvedAgentPaths): ReadonlyArray<AgentRuleBundle>;
5487
+ /**
5488
+ * Built-in rule bundles assembled with the default agent paths.
5489
+ * Preserved for backward compatibility with tests and consumers
5490
+ * that import the array directly. Prefer `buildBuiltInBundles(paths)`
5491
+ * when consumer overrides are in scope.
2210
5492
  */
2211
5493
  declare const BUILT_IN_BUNDLES: ReadonlyArray<AgentRuleBundle>;
2212
5494
 
@@ -2471,6 +5753,150 @@ interface TemplateResolveResult {
2471
5753
  */
2472
5754
  declare function resolveTemplateVariables(template: string, metadata: ResolvedProjectMetadata | undefined): TemplateResolveResult;
2473
5755
 
5756
+ /**
5757
+ * Options for the `.api.md` rollup slot produced by API Extractor.
5758
+ */
5759
+ interface ApiExtractorReportOptions {
5760
+ /**
5761
+ * Folder (relative to the package root) where the `.api.md` rollup
5762
+ * is written when the extractor runs. Treated as a scratch/temp
5763
+ * location because rollups are **regenerated on scan** rather than
5764
+ * committed to git (per docs-sync epic #448 resolved decision #3).
5765
+ *
5766
+ * The parent `ApiExtractor` component adds this folder to the
5767
+ * package's `.gitignore` so rollups never land on the default branch.
5768
+ *
5769
+ * @default ".api-extractor/"
5770
+ */
5771
+ readonly reportFolder?: string;
5772
+ /**
5773
+ * Filename of the generated rollup, relative to `reportFolder`.
5774
+ * Accepts the `<unscopedPackageName>` placeholder API Extractor
5775
+ * expands at runtime.
5776
+ *
5777
+ * @default "<unscopedPackageName>.api.md"
5778
+ */
5779
+ readonly reportFileName?: string;
5780
+ }
5781
+ /**
5782
+ * Options for the `ApiExtractor` projen component.
5783
+ */
5784
+ interface ApiExtractorOptions {
5785
+ /**
5786
+ * Path to the TypeScript `.d.ts` rollup produced by the package's
5787
+ * compile step, relative to the package root. Used as the
5788
+ * extractor's `mainEntryPointFilePath`.
5789
+ *
5790
+ * Defaults to `<projectFolder>/lib/index.d.ts` — matches the
5791
+ * `TypeScriptProject` default layout.
5792
+ *
5793
+ * @default "<projectFolder>/lib/index.d.ts"
5794
+ */
5795
+ readonly mainEntryPointFilePath?: string;
5796
+ /**
5797
+ * Path to the generated `api-extractor.json` config file (relative
5798
+ * to the package root).
5799
+ *
5800
+ * @default "api-extractor.json"
5801
+ */
5802
+ readonly configFilePath?: string;
5803
+ /**
5804
+ * Rollup report options (where the `.api.md` lands).
5805
+ */
5806
+ readonly report?: ApiExtractorReportOptions;
5807
+ /**
5808
+ * Override the version of `@microsoft/api-extractor` that is added
5809
+ * to the package's devDeps. Defaults to `VERSION.API_EXTRACTOR_VERSION`.
5810
+ */
5811
+ readonly apiExtractorVersion?: string;
5812
+ /**
5813
+ * When `true`, the extractor's `.api.md` rollup is treated as the
5814
+ * committed baseline and diff-checked in-place. The docs-sync epic
5815
+ * deliberately sets this to `false` — rollups are regenerate-on-scan
5816
+ * and not committed to git.
5817
+ *
5818
+ * @default false
5819
+ */
5820
+ readonly commitApiReport?: boolean;
5821
+ }
5822
+ /**
5823
+ * Default folder where `.api.md` rollups are written. Gitignored by
5824
+ * the component so rollups never land in a commit.
5825
+ */
5826
+ declare const DEFAULT_API_EXTRACTOR_REPORT_FOLDER = ".api-extractor/";
5827
+ /**
5828
+ * Default filename template for rollups. The `<unscopedPackageName>`
5829
+ * placeholder is expanded by `@microsoft/api-extractor` at run time.
5830
+ */
5831
+ declare const DEFAULT_API_EXTRACTOR_REPORT_FILENAME = "<unscopedPackageName>.api.md";
5832
+ /**
5833
+ * Default path (relative to the package root) to the TypeScript
5834
+ * `.d.ts` rollup the extractor consumes. Matches the
5835
+ * `TypeScriptProject` default output layout.
5836
+ */
5837
+ declare const DEFAULT_API_EXTRACTOR_ENTRY_POINT = "<projectFolder>/lib/index.d.ts";
5838
+ /**
5839
+ * Default path (relative to the package root) to the generated
5840
+ * `api-extractor.json` config file.
5841
+ */
5842
+ declare const DEFAULT_API_EXTRACTOR_CONFIG_FILE = "api-extractor.json";
5843
+ /**
5844
+ * Wires `@microsoft/api-extractor` into a TypeScript project so the
5845
+ * docs-sync pipeline can detect public-API drift introduced by a
5846
+ * diff.
5847
+ *
5848
+ * The component adds the extractor devDep, synthesizes an
5849
+ * `api-extractor.json` under the package root, and gitignores the
5850
+ * generated `.api.md` rollup. Rollups are **regenerated on scan**
5851
+ * (never committed to git) per docs-sync epic #448 resolved
5852
+ * decision #3 — the in-repo helper at
5853
+ * `.claude/procedures/extract-api.sh` runs the extractor end-to-end
5854
+ * and writes the rollup to the scratch folder for the scan phase
5855
+ * to consume in-memory.
5856
+ *
5857
+ * Callers normally do not construct this directly — the
5858
+ * `TypeScriptProject` constructor creates one automatically.
5859
+ */
5860
+ declare class ApiExtractor extends Component {
5861
+ readonly project: NodeProject;
5862
+ /**
5863
+ * Find the ApiExtractor component on a project.
5864
+ */
5865
+ static of(project: NodeProject): ApiExtractor | undefined;
5866
+ /**
5867
+ * Generated config file path, relative to the package root.
5868
+ */
5869
+ readonly configFilePath: string;
5870
+ /**
5871
+ * Entry-point path supplied to the extractor.
5872
+ */
5873
+ readonly mainEntryPointFilePath: string;
5874
+ /**
5875
+ * Folder where `.api.md` rollups are written.
5876
+ */
5877
+ readonly reportFolder: string;
5878
+ /**
5879
+ * Filename (or filename template) of the rollup.
5880
+ */
5881
+ readonly reportFileName: string;
5882
+ /**
5883
+ * Pinned version of `@microsoft/api-extractor`.
5884
+ */
5885
+ readonly apiExtractorVersion: string;
5886
+ /**
5887
+ * Whether the generated report is committed alongside source.
5888
+ * `false` by default — rollups regenerate on scan.
5889
+ */
5890
+ readonly commitApiReport: boolean;
5891
+ constructor(project: NodeProject, options?: ApiExtractorOptions);
5892
+ /**
5893
+ * Render the JSON body of the generated `api-extractor.json`. Kept
5894
+ * as a public method so tests can assert the shape without going
5895
+ * through `synthSnapshot`.
5896
+ */
5897
+ renderConfig(): Record<string, unknown>;
5898
+ }
5899
+
2474
5900
  /**
2475
5901
  * Astro output mode.
2476
5902
  *
@@ -2923,16 +6349,24 @@ interface AwsOrganization {
2923
6349
  declare function getLatestEligibleVersion(packageName: string, minimumReleaseAgeMinutes: number): Promise<string | null>;
2924
6350
 
2925
6351
  declare const VERSION: {
6352
+ /**
6353
+ * Version of `@microsoft/api-extractor` to pin for the docs-sync
6354
+ * public-API drift detection runner. Used by the `ApiExtractor`
6355
+ * component (wired into every `TypeScriptProject`) and the shared
6356
+ * helper at `.claude/procedures/extract-api.sh`. See docs-sync
6357
+ * epic child issue #513.
6358
+ */
6359
+ readonly API_EXTRACTOR_VERSION: "7.58.7";
2926
6360
  /**
2927
6361
  * Version of Astro to pin for AstroProject scaffolding.
2928
6362
  */
2929
- readonly ASTRO_VERSION: "6.1.8";
6363
+ readonly ASTRO_VERSION: "6.1.9";
2930
6364
  /**
2931
6365
  * CDK CLI for workflows and command line operations.
2932
6366
  *
2933
6367
  * CLI and lib are versioned separately, so this is the CLI version.
2934
6368
  */
2935
- readonly AWS_CDK_CLI_VERSION: "2.1118.2";
6369
+ readonly AWS_CDK_CLI_VERSION: "2.1119.0";
2936
6370
  /**
2937
6371
  * CDK Version to use for construct projects.
2938
6372
  *
@@ -2955,11 +6389,11 @@ declare const VERSION: {
2955
6389
  /**
2956
6390
  * Version of PNPM to use in workflows at github actions.
2957
6391
  */
2958
- readonly PNPM_VERSION: "10.33.0";
6392
+ readonly PNPM_VERSION: "10.33.2";
2959
6393
  /**
2960
6394
  * Version of Projen to use.
2961
6395
  */
2962
- readonly PROJEN_VERSION: "0.99.51";
6396
+ readonly PROJEN_VERSION: "0.99.52";
2963
6397
  /**
2964
6398
  * Version of `actions/setup-node` to use in GitHub workflows.
2965
6399
  * Tracks the version projen currently emits (see node_modules/projen/lib/github/workflows.js).
@@ -2973,7 +6407,7 @@ declare const VERSION: {
2973
6407
  /**
2974
6408
  * Version of @astrojs/starlight to pin for StarlightProject scaffolding.
2975
6409
  */
2976
- readonly STARLIGHT_VERSION: "0.38.3";
6410
+ readonly STARLIGHT_VERSION: "0.38.4";
2977
6411
  /**
2978
6412
  * What version of the turborepo library should we use?
2979
6413
  */
@@ -3514,6 +6948,16 @@ interface TypeScriptProjectOptions extends Omit<typescript.TypeScriptProjectOpti
3514
6948
  * @default false
3515
6949
  */
3516
6950
  readonly agentConfig?: AgentConfigOptions | boolean;
6951
+ /**
6952
+ * Configure the `@microsoft/api-extractor` runner used by the
6953
+ * docs-sync pipeline for public-API drift detection. When omitted
6954
+ * the extractor is enabled with default options (rollups write to
6955
+ * `.api-extractor/` and are gitignored). Set to `false` to opt a
6956
+ * package out of drift detection entirely.
6957
+ *
6958
+ * @default {}
6959
+ */
6960
+ readonly apiExtractor?: ApiExtractorOptions | false;
3517
6961
  }
3518
6962
  declare class TypeScriptProject extends typescript.TypeScriptProject {
3519
6963
  constructor(userOptions: TypeScriptProjectOptions);
@@ -4784,4 +8228,4 @@ declare const COMPLETE_JOB_ID = "complete";
4784
8228
  */
4785
8229
  declare function addBuildCompleteJob(buildWorkflow: BuildWorkflow): void;
4786
8230
 
4787
- export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AgentConfig, type AgentConfigOptions, type AgentExpansionRules, type AgentFeaturesConfig, type AgentModel, type AgentPathsConfig, type AgentPlatform, type AgentPlatformOverrides, type AgentProcedure, type AgentRule, type AgentRuleBundle, type AgentRuleScope, type AgentSkill, type AgentSubAgent, type AgentSubAgentPlatformOverrides, type ApproveMergeUpgradeOptions, AstroConfig, type AstroConfigOptions, type AstroIntegrationSpec, AstroOutput, AstroProject, type AstroProjectOptions, type AwsAccount, AwsCdkProject, type AwsCdkProjectOptions, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, type AwsDeploymentTargetOptions, type AwsLocalDeploymentConfig, type AwsOrganization, type AwsRegion, AwsTeardownWorkflow, type AwsTeardownWorkflowOptions, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, type CiDeploymentConfig, type ClassTypeOptions, type ClaudeAutoModeConfig, type ClaudeHookAction, type ClaudeHookEntry, type ClaudeHooksConfig, type ClaudePermissionsConfig, type ClaudeRuleTarget, type ClaudeSandboxConfig, type ClaudeSettingsConfig, type CopilotHandoff, type CursorHookAction, type CursorHooksConfig, type CursorSettingsConfig, type CustomDocSection, DEFAULT_AGENT_PATHS, DEFAULT_PRIORITY_LABELS, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, type DeployWorkflowOptions, type DeploymentMetadata, type FocusArea, type FocusAreaMatch, type FocusConfig, type GitBranch, type GitHubBoardMetadata, type GitHubProjectMetadata, type GitHubSprintMetadata, type IDependencyResolver, JsiiFaker, LAYOUT_ENFORCEMENT, LAYOUT_ROOT_BY_PROJECT_TYPE, type LabelDefinition, type LayoutEnforcement, type LayoutViolation, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, MONOREPO_LAYOUT, type McpServerConfig, type McpTransport, type MeetingArea, type MeetingScope, type MeetingType, type MeetingTypeKind, type MeetingsConfig, type MergeMethod, type MonorepoLayoutRoot, MonorepoProject, type MonorepoProjectOptions, type OrganizationMetadata, PROD_DEPLOY_NAME, PnpmWorkspace, type PnpmWorkspaceOptions, type PriorityRule, ProjectMetadata, type ProjectMetadataOptions, REQUIREMENTS_WRITER_PATHS, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, type RemoteCacheOptions, type RepositoryMetadata, ResetTask, type ResetTaskOptions, type ResolvedAgentPaths, type ResolvedProjectMetadata, STARLIGHT_ROLE, type SlackMetadata, type SourceTierExamples, type StarlightEditLink, type StarlightLogo, StarlightProject, type StarlightProjectOptions, type StarlightRole, type StarlightSidebarItem, type StarlightSingletonViolation, type StarlightSocialLink, type SyncLabelsOptions, type TemplateResolveResult, TestRunner, TurboRepo, type TurboRepoOptions, TurboRepoTask, type TurboRepoTaskOptions, TypeScriptConfig, TypeScriptProject, type TypeScriptProjectOptions, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, type VersionKey, Vitest, type VitestConfigOptions, type VitestOptions, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, agendaBundle, awsCdkBundle, baseBundle, bcmWriterBundle, businessModelsBundle, companyProfileBundle, formatLayoutViolation, formatStarlightSingletonViolation, getLatestEligibleVersion, githubWorkflowBundle, industryDiscoveryBundle, jestBundle, maintenanceAuditBundle, meetingAnalysisBundle, orchestratorBundle, peopleProfileBundle, pnpmBundle, prReviewBundle, projenBundle, renderCustomDocSectionBlock, renderCustomDocSections, renderFocusSection, renderMeetingTypesSection, renderPriorityRulesSection, renderSourceTierExamples, requirementsAnalystBundle, requirementsReviewerBundle, requirementsWriterBundle, researchPipelineBundle, resolveAgentPaths, resolveAstroProjectOutdir, resolveAwsCdkProjectOutdir, resolveModelAlias, resolveOutdirFromPackageName, resolveTemplateVariables, resolveTypeScriptProjectOutdir, slackBundle, softwareProfileBundle, turborepoBundle, typescriptBundle, validateMonorepoLayout, validateStarlightSingleton, vitestBundle };
8231
+ export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AGENT_TIER_ROLES, AGENT_TIER_VALUES, AgentConfig, type AgentConfigOptions, type AgentExpansionRules, type AgentFeaturesConfig, type AgentModel, type AgentPathsConfig, type AgentPlatform, type AgentPlatformOverrides, type AgentProcedure, type AgentRule, type AgentRuleBundle, type AgentRuleScope, type AgentSkill, type AgentSubAgent, type AgentSubAgentPlatformOverrides, type AgentTier, type AgentTierConfig, type AgentTierEntry, ApiExtractor, type ApiExtractorOptions, type ApiExtractorReportOptions, type ApproveMergeUpgradeOptions, AstroConfig, type AstroConfigOptions, type AstroIntegrationSpec, AstroOutput, AstroProject, type AstroProjectOptions, type AwsAccount, AwsCdkProject, type AwsCdkProjectOptions, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, type AwsDeploymentTargetOptions, type AwsLocalDeploymentConfig, type AwsOrganization, type AwsRegion, AwsTeardownWorkflow, type AwsTeardownWorkflowOptions, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, type CiDeploymentConfig, type ClassTypeOptions, type ClaudeAutoModeConfig, type ClaudeHookAction, type ClaudeHookEntry, type ClaudeHooksConfig, type ClaudePermissionsConfig, type ClaudeRuleTarget, type ClaudeSandboxConfig, type ClaudeSettingsConfig, type CopilotHandoff, type CursorHookAction, type CursorHooksConfig, type CursorSettingsConfig, type CustomDocSection, DEFAULT_AC_THRESHOLDS, DEFAULT_AGENT_PATHS, DEFAULT_AGENT_TIERS, DEFAULT_API_EXTRACTOR_CONFIG_FILE, DEFAULT_API_EXTRACTOR_ENTRY_POINT, DEFAULT_API_EXTRACTOR_REPORT_FILENAME, DEFAULT_API_EXTRACTOR_REPORT_FOLDER, DEFAULT_DECOMPOSITION_TEMPLATE, DEFAULT_DELEGATE_TO_PR_REVIEWER, DEFAULT_DISPATCH_MODEL, DEFAULT_DISPATCH_TO_HOUSEKEEPING_RATIO, DEFAULT_HOUSEKEEPING_MODEL, DEFAULT_ISSUE_TEMPLATES_BUNDLE_PATH_PATTERNS, DEFAULT_ISSUE_TEMPLATES_EMIT_CHECKER, DEFAULT_ISSUE_TEMPLATES_EMIT_STARTER, DEFAULT_ISSUE_TEMPLATES_ENABLED, DEFAULT_ISSUE_TEMPLATES_PATH, DEFAULT_ISSUE_TEMPLATES_REQUIRE_REFERENCE, DEFAULT_MERGE_METHOD, DEFAULT_OFF_PEAK_CRON_EXAMPLE, DEFAULT_PARTIAL_UNBLOCK_COMMENT_TEMPLATE, DEFAULT_PRIORITY_LABELS, DEFAULT_PRODUCT_CONTEXT_PATH, DEFAULT_PROGRESS_FILES_ENABLED, DEFAULT_PROGRESS_FILES_FILENAME_PATTERN, DEFAULT_PROGRESS_FILES_FORMAT, DEFAULT_PROGRESS_FILES_STALE_AFTER_HOURS, DEFAULT_PROGRESS_FILES_STATE_DIR, DEFAULT_REQUIRE_LINKED_ISSUE, DEFAULT_REQUIRE_PRODUCT_CONTEXT, DEFAULT_SCHEDULED_TASKS_ROOT, DEFAULT_SCHEDULED_TASK_ENTRIES, DEFAULT_SHARED_EDITING_CONFLICT_STRATEGY, DEFAULT_SHARED_EDITING_EMIT_HELPER, DEFAULT_SHARED_EDITING_ENABLED, DEFAULT_SHARED_EDITING_VERIFY_COMMIT, DEFAULT_SHARED_INDEX_PATHS, DEFAULT_SKILL_EVALS_EMIT_RUNNER, DEFAULT_SKILL_EVALS_ENABLED, DEFAULT_SKILL_EVALS_SKILLS_ROOT, DEFAULT_SOURCES_THRESHOLDS, DEFAULT_STATE_FILE_PATH, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, DEFAULT_UNBLOCK_COMMENT_TEMPLATE, DEFAULT_UNBLOCK_DEPENDENTS_ENABLED, DEFAULT_WORKFLOW_DIAGRAMS_BUNDLE_PATH_PATTERNS, DEFAULT_WORKFLOW_DIAGRAMS_EMIT_CHECKER, DEFAULT_WORKFLOW_DIAGRAMS_EMIT_STARTER, DEFAULT_WORKFLOW_DIAGRAMS_ENABLED, DEFAULT_WORKFLOW_DIAGRAMS_PATH, DEFAULT_WORKFLOW_DIAGRAMS_REQUIRE_UPDATE, type DeployWorkflowOptions, type DeploymentMetadata, type FocusArea, type FocusAreaMatch, type FocusConfig, type GitBranch, type GitHubBoardMetadata, type GitHubProjectMetadata, type GitHubSprintMetadata, type IDependencyResolver, type IssueTemplatesConfig, JsiiFaker, LAYOUT_ENFORCEMENT, LAYOUT_ROOT_BY_PROJECT_TYPE, type LabelDefinition, type LayoutEnforcement, type LayoutViolation, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, MONOREPO_LAYOUT, type McpServerConfig, type McpTransport, type MeetingArea, type MeetingScope, type MeetingType, type MeetingTypeKind, type MeetingsConfig, type MergeMethod, type MonorepoLayoutRoot, MonorepoProject, type MonorepoProjectOptions, type OrganizationMetadata, PREFLIGHT_MERGE_METHOD_VALUES, PROD_DEPLOY_NAME, PROGRESS_FILES_FORMAT_VALUES, PnpmWorkspace, type PnpmWorkspaceOptions, type PreflightMergeMethod, type PreflightPrConfig, type PriorityRule, type ProgressFilesConfig, ProjectMetadata, type ProjectMetadataOptions, REQUIREMENTS_WRITER_PATHS, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, type RemoteCacheOptions, type RepositoryMetadata, ResetTask, type ResetTaskOptions, type ResolvedAgentPaths, type ResolvedAgentTier, type ResolvedIssueTemplates, type ResolvedPreflightPr, type ResolvedProgressFiles, type ResolvedProjectMetadata, type ResolvedRunRatio, type ResolvedScheduledTask, type ResolvedScheduledTasks, type ResolvedScopeGate, type ResolvedSharedEditing, type ResolvedSkillEvals, type ResolvedUnblockDependents, type ResolvedWorkflowDiagrams, type RunRatioConfig, SCHEDULED_TASK_MODEL_VALUES, SCOPE_CLASS_VALUES, SHARED_EDITING_CONFLICT_STRATEGY_VALUES, STARLIGHT_ROLE, type ScheduledTaskEntry, type ScheduledTaskModel, type ScheduledTaskOverride, type ScheduledTasksConfig, type ScopeClass, type ScopeGateConfig, type ScopeGateThresholds, type SharedEditingConfig, type SkillEvalsConfig, type SlackMetadata, type SourceTierExamples, type StarlightEditLink, type StarlightLogo, StarlightProject, type StarlightProjectOptions, type StarlightRole, type StarlightSidebarItem, type StarlightSingletonViolation, type StarlightSocialLink, type SyncLabelsOptions, type TemplateResolveResult, TestRunner, TurboRepo, type TurboRepoOptions, TurboRepoTask, type TurboRepoTaskOptions, TypeScriptConfig, TypeScriptProject, type TypeScriptProjectOptions, UNKNOWN_TYPE_FALLBACK_TIER, type UnblockDependentsConfig, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, type VersionKey, Vitest, type VitestConfigOptions, type VitestOptions, type WorkflowDiagramsConfig, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, agendaBundle, awsCdkBundle, baseBundle, bcmWriterBundle, buildBaseBundle, buildBcmWriterBundle, buildBuiltInBundles, buildBusinessModelsBundle, buildCheckBlockedProcedure, buildCompanyProfileBundle, buildCustomerProfileBundle, buildDocsSyncBundle, buildIndustryDiscoveryBundle, buildMaintenanceAuditBundle, buildOrchestratorConventionsContent, buildPeopleProfileBundle, buildRegulatoryResearchBundle, buildRequirementsAnalystBundle, buildRequirementsReviewerBundle, buildRequirementsWriterBundle, buildResearchPipelineBundle, buildSoftwareProfileBundle, buildStandardsResearchBundle, buildUnblockDependentsProcedure, businessModelsBundle, classifyIssueScope, classifyRun, companyProfileBundle, customerProfileBundle, docsSyncBundle, extractApiProcedure, formatLayoutViolation, formatStarlightSingletonViolation, getLatestEligibleVersion, githubWorkflowBundle, industryDiscoveryBundle, jestBundle, maintenanceAuditBundle, meetingAnalysisBundle, orchestratorBundle, peopleProfileBundle, pnpmBundle, prReviewBundle, projenBundle, regulatoryResearchBundle, renderAgentTierCaseStatement, renderAgentTierSection, renderCustomDocSectionBlock, renderCustomDocSections, renderExtractApiProcedure, renderFocusSection, renderIssueTemplatesBundleHook, renderIssueTemplatesCheckerScript, renderIssueTemplatesRuleContent, renderIssueTemplatesStarterPage, renderMeetingTypesSection, renderPreflightPrSection, renderPreflightPrShellHelpers, renderPriorityRulesSection, renderProgressFileName, renderProgressFilePath, renderProgressFilesBundleHook, renderProgressFilesRuleContent, renderRunRatioSection, renderRunRatioShellHelpers, renderScheduledTaskSkillFile, renderScheduledTasksSection, renderScopeGateSection, renderScopeGateShellHelpers, renderSharedEditingBundleHook, renderSharedEditingHelperScript, renderSharedEditingRuleContent, renderSkillEvalsBundleHook, renderSkillEvalsRuleContent, renderSkillEvalsRunnerScript, renderSourceTierExamples, renderUnblockDependentsScript, renderUnblockDependentsSection, renderWorkflowDiagramsBundleHook, renderWorkflowDiagramsCheckerScript, renderWorkflowDiagramsRuleContent, renderWorkflowDiagramsStarterPage, requirementsAnalystBundle, requirementsReviewerBundle, requirementsWriterBundle, researchPipelineBundle, resolveAgentPaths, resolveAgentTiers, resolveAstroProjectOutdir, resolveAwsCdkProjectOutdir, resolveIssueTemplates, resolveModelAlias, resolveOrchestratorAssets, resolveOutdirFromPackageName, resolvePreflightPr, resolveProgressFiles, resolveRunRatio, resolveScheduledTasks, resolveScopeGate, resolveSharedEditing, resolveSkillEvals, resolveTemplateVariables, resolveTypeScriptProjectOutdir, resolveUnblockDependents, resolveWorkflowDiagrams, slackBundle, softwareProfileBundle, standardsResearchBundle, turborepoBundle, typescriptBundle, validateAgentTierConfig, validateIssueTemplatesConfig, validateMonorepoLayout, validatePreflightPrConfig, validateProgressFilesConfig, validateRunRatioConfig, validateScheduledTasksConfig, validateScopeGateConfig, validateSharedEditingConfig, validateSkillEvalsConfig, validateStarlightSingleton, validateUnblockDependentsConfig, validateWorkflowDiagramsConfig, vitestBundle };