@codedrifters/configulator 0.0.275 → 0.0.277

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -246,16 +246,11 @@ __export(index_exports, {
246
246
  DEFAULT_TYPE_LABELS: () => DEFAULT_TYPE_LABELS,
247
247
  DEFAULT_UNBLOCK_COMMENT_TEMPLATE: () => DEFAULT_UNBLOCK_COMMENT_TEMPLATE,
248
248
  DEFAULT_UNBLOCK_DEPENDENTS_ENABLED: () => DEFAULT_UNBLOCK_DEPENDENTS_ENABLED,
249
- DEFAULT_WORKFLOW_DIAGRAMS_BUNDLE_PATH_PATTERNS: () => DEFAULT_WORKFLOW_DIAGRAMS_BUNDLE_PATH_PATTERNS,
250
- DEFAULT_WORKFLOW_DIAGRAMS_EMIT_CHECKER: () => DEFAULT_WORKFLOW_DIAGRAMS_EMIT_CHECKER,
251
- DEFAULT_WORKFLOW_DIAGRAMS_EMIT_STARTER: () => DEFAULT_WORKFLOW_DIAGRAMS_EMIT_STARTER,
252
- DEFAULT_WORKFLOW_DIAGRAMS_ENABLED: () => DEFAULT_WORKFLOW_DIAGRAMS_ENABLED,
253
- DEFAULT_WORKFLOW_DIAGRAMS_PATH: () => DEFAULT_WORKFLOW_DIAGRAMS_PATH,
254
- DEFAULT_WORKFLOW_DIAGRAMS_REQUIRE_UPDATE: () => DEFAULT_WORKFLOW_DIAGRAMS_REQUIRE_UPDATE,
255
249
  DOCS_SYNC_AUDIT_SCHEMA_VERSION: () => DOCS_SYNC_AUDIT_SCHEMA_VERSION,
256
250
  JsiiFaker: () => JsiiFaker,
257
251
  LAYOUT_ENFORCEMENT: () => LAYOUT_ENFORCEMENT,
258
252
  LAYOUT_ROOT_BY_PROJECT_TYPE: () => LAYOUT_ROOT_BY_PROJECT_TYPE,
253
+ MAX_LABEL_DESCRIPTION_LENGTH: () => MAX_LABEL_DESCRIPTION_LENGTH,
259
254
  MCP_TRANSPORT: () => MCP_TRANSPORT,
260
255
  MERGE_METHODS: () => MERGE_METHODS,
261
256
  MIMIMUM_RELEASE_AGE: () => MIMIMUM_RELEASE_AGE,
@@ -326,7 +321,11 @@ __export(index_exports, {
326
321
  classifyRun: () => classifyRun,
327
322
  companyProfileBundle: () => companyProfileBundle,
328
323
  compileFencedSamples: () => compileFencedSamples,
324
+ createApiDiffCheck: () => createApiDiffCheck,
325
+ createReferenceMismatchCheck: () => createReferenceMismatchCheck,
326
+ createTsdocCoverageCheck: () => createTsdocCoverageCheck,
329
327
  customerProfileBundle: () => customerProfileBundle,
328
+ diffApiRollups: () => diffApiRollups,
330
329
  docsSyncBundle: () => docsSyncBundle,
331
330
  emptyCategoryBuckets: () => emptyCategoryBuckets,
332
331
  extractApiProcedure: () => extractApiProcedure,
@@ -341,11 +340,13 @@ __export(index_exports, {
341
340
  maintenanceAuditBundle: () => maintenanceAuditBundle,
342
341
  meetingAnalysisBundle: () => meetingAnalysisBundle,
343
342
  orchestratorBundle: () => orchestratorBundle,
343
+ parseApiRollup: () => parseApiRollup,
344
344
  peopleProfileBundle: () => peopleProfileBundle,
345
345
  persistAuditReport: () => persistAuditReport,
346
346
  pnpmBundle: () => pnpmBundle,
347
347
  prReviewBundle: () => prReviewBundle,
348
348
  projenBundle: () => projenBundle,
349
+ referenceRecordToFinding: () => referenceRecordToFinding,
349
350
  regulatoryResearchBundle: () => regulatoryResearchBundle,
350
351
  renderAgentTierCaseStatement: () => renderAgentTierCaseStatement,
351
352
  renderAgentTierSection: () => renderAgentTierSection,
@@ -382,10 +383,6 @@ __export(index_exports, {
382
383
  renderSourceTierExamples: () => renderSourceTierExamples,
383
384
  renderUnblockDependentsScript: () => renderUnblockDependentsScript,
384
385
  renderUnblockDependentsSection: () => renderUnblockDependentsSection,
385
- renderWorkflowDiagramsBundleHook: () => renderWorkflowDiagramsBundleHook,
386
- renderWorkflowDiagramsCheckerScript: () => renderWorkflowDiagramsCheckerScript,
387
- renderWorkflowDiagramsRuleContent: () => renderWorkflowDiagramsRuleContent,
388
- renderWorkflowDiagramsStarterPage: () => renderWorkflowDiagramsStarterPage,
389
386
  requirementsAnalystBundle: () => requirementsAnalystBundle,
390
387
  requirementsReviewerBundle: () => requirementsReviewerBundle,
391
388
  requirementsWriterBundle: () => requirementsWriterBundle,
@@ -408,11 +405,11 @@ __export(index_exports, {
408
405
  resolveTemplateVariables: () => resolveTemplateVariables,
409
406
  resolveTypeScriptProjectOutdir: () => resolveTypeScriptProjectOutdir,
410
407
  resolveUnblockDependents: () => resolveUnblockDependents,
411
- resolveWorkflowDiagrams: () => resolveWorkflowDiagrams,
412
408
  runScan: () => runScan,
413
409
  slackBundle: () => slackBundle,
414
410
  softwareProfileBundle: () => softwareProfileBundle,
415
411
  standardsResearchBundle: () => standardsResearchBundle,
412
+ tsdocRecordToFindings: () => tsdocRecordToFindings,
416
413
  turborepoBundle: () => turborepoBundle,
417
414
  typescriptBundle: () => typescriptBundle,
418
415
  validateAgentTierConfig: () => validateAgentTierConfig,
@@ -427,7 +424,6 @@ __export(index_exports, {
427
424
  validateSkillEvalsConfig: () => validateSkillEvalsConfig,
428
425
  validateStarlightSingleton: () => validateStarlightSingleton,
429
426
  validateUnblockDependentsConfig: () => validateUnblockDependentsConfig,
430
- validateWorkflowDiagramsConfig: () => validateWorkflowDiagramsConfig,
431
427
  vitestBundle: () => vitestBundle
432
428
  });
433
429
  module.exports = __toCommonJS(index_exports);
@@ -1196,7 +1192,7 @@ var agendaBundle = {
1196
1192
  {
1197
1193
  name: "agenda:finalize",
1198
1194
  color: "BFDADC",
1199
- description: "Phase 2: incorporate late-added items, register in the meetings index, cross-link related docs, and lock the agenda"
1195
+ description: "Phase 2: register in meetings index, cross-link related docs, and lock the agenda before the meeting"
1200
1196
  }
1201
1197
  ]
1202
1198
  };
@@ -3043,442 +3039,6 @@ function assertValidProductContextPath(value) {
3043
3039
  }
3044
3040
  }
3045
3041
 
3046
- // src/agent/bundles/workflow-diagrams.ts
3047
- var DEFAULT_WORKFLOW_DIAGRAMS_ENABLED = true;
3048
- var DEFAULT_WORKFLOW_DIAGRAMS_PATH = "docs/src/content/docs/agents/workflows.md";
3049
- var DEFAULT_WORKFLOW_DIAGRAMS_BUNDLE_PATH_PATTERNS = [
3050
- "packages/@codedrifters/configulator/src/agent/bundles/**/*.ts",
3051
- ".claude/agents/**/*.md",
3052
- ".claude/skills/**/*.md"
3053
- ];
3054
- var DEFAULT_WORKFLOW_DIAGRAMS_EMIT_STARTER = false;
3055
- var DEFAULT_WORKFLOW_DIAGRAMS_EMIT_CHECKER = false;
3056
- var DEFAULT_WORKFLOW_DIAGRAMS_REQUIRE_UPDATE = true;
3057
- function resolveWorkflowDiagrams(config) {
3058
- const diagramsPath = config?.diagramsPath ?? DEFAULT_WORKFLOW_DIAGRAMS_PATH;
3059
- assertValidDiagramsPath(diagramsPath);
3060
- const bundlePathPatterns = config?.bundlePathPatterns ?? DEFAULT_WORKFLOW_DIAGRAMS_BUNDLE_PATH_PATTERNS;
3061
- assertValidBundlePathPatterns2(bundlePathPatterns);
3062
- return {
3063
- enabled: config?.enabled ?? DEFAULT_WORKFLOW_DIAGRAMS_ENABLED,
3064
- diagramsPath,
3065
- bundlePathPatterns,
3066
- emitStarterDiagram: config?.emitStarterDiagram ?? DEFAULT_WORKFLOW_DIAGRAMS_EMIT_STARTER,
3067
- emitChecker: config?.emitChecker ?? DEFAULT_WORKFLOW_DIAGRAMS_EMIT_CHECKER,
3068
- requireDiagramUpdate: config?.requireDiagramUpdate ?? DEFAULT_WORKFLOW_DIAGRAMS_REQUIRE_UPDATE
3069
- };
3070
- }
3071
- function validateWorkflowDiagramsConfig(config) {
3072
- return resolveWorkflowDiagrams(config);
3073
- }
3074
- function renderWorkflowDiagramsRuleContent(wd) {
3075
- if (!wd.enabled) {
3076
- return [
3077
- "# Workflow Diagrams",
3078
- "",
3079
- "**The workflow-diagrams convention is disabled in this project.**",
3080
- "Agents may change bundle or agent source files without updating",
3081
- "any diagrams page. When diagrams fall behind the prose, humans",
3082
- "must reconcile them manually.",
3083
- "",
3084
- "Enable the convention via",
3085
- "`AgentConfigOptions.workflowDiagrams.enabled = true`."
3086
- ].join("\n");
3087
- }
3088
- const requirementVerb = wd.requireDiagramUpdate ? "MUST" : "SHOULD";
3089
- const lines = [
3090
- "# Workflow Diagrams",
3091
- "",
3092
- "This project maintains a single hand-authored workflow-diagrams",
3093
- "page that visualises every agent's phases, its decision points,",
3094
- "and every cross-agent handoff. Prose scattered across rule files",
3095
- "and agent prompts describes each handoff in isolation; the",
3096
- "diagrams page is the single visual reference that shows the",
3097
- "whole pipeline at once.",
3098
- "",
3099
- "Diagrams are **hand-authored for readability**, not",
3100
- "auto-generated. A machine-generated graph of bundle dependencies",
3101
- "would technically stay in sync, but would not communicate the",
3102
- "intent behind each handoff \u2014 so the convention trades",
3103
- "auto-sync for editorial clarity and enforces sync via the rule",
3104
- "below.",
3105
- "",
3106
- "## Diagrams Page",
3107
- "",
3108
- `The workflow-diagrams page lives at \`${wd.diagramsPath}\`. It`,
3109
- "follows a stable structure so the sync rule can mechanically",
3110
- "identify which section matches which bundle:",
3111
- "",
3112
- "1. **Master cross-agent diagram** \u2014 one top-level Mermaid",
3113
- " flowchart showing every agent as a node and every",
3114
- " cross-agent issue-creation or file-consumption handoff as an",
3115
- " edge.",
3116
- "2. **One section per agent / bundle** \u2014 a `## N. <agent-name>`",
3117
- " heading followed by a single Mermaid `flowchart TD` diagram",
3118
- " that depicts the agent's phase graph (nodes = phases /",
3119
- " decisions, edges = transitions, styled end-nodes = commit /",
3120
- " PR / done terminals).",
3121
- "3. **Legend** \u2014 a short table mapping colours and arrow styles",
3122
- " to their meanings (dispatcher vs agent vs skill; solid vs",
3123
- " dashed arrows for issue-creation vs file-consumption).",
3124
- "",
3125
- "Each agent section is independent. Changing one agent's phase",
3126
- "graph touches only that section; cross-agent handoff changes",
3127
- "touch the master diagram plus any affected agent sections.",
3128
- "",
3129
- "## Diagram-Touched-When-Bundle-Touched Rule",
3130
- "",
3131
- `Every change that modifies a bundle's phase graph ${requirementVerb}`,
3132
- `also update \`${wd.diagramsPath}\` in the same change set. The`,
3133
- "rule applies when **any** staged file in a commit or PR matches",
3134
- "one of the bundle-path patterns below:",
3135
- "",
3136
- ...wd.bundlePathPatterns.map((p) => `- \`${p}\``),
3137
- "",
3138
- "Mechanically: when a change set includes a file matching one of",
3139
- `the patterns above, it ${requirementVerb} also include a`,
3140
- `modification to \`${wd.diagramsPath}\`.`,
3141
- "",
3142
- "### What counts as a phase-graph change",
3143
- "",
3144
- "The rule targets edits that change **what the agent does**, not",
3145
- "stylistic tweaks. Concretely:",
3146
- "",
3147
- "- Adding, removing, or renaming a phase label.",
3148
- "- Changing a phase's inputs, outputs, or decision branches.",
3149
- "- Adding or removing a cross-agent handoff (an issue-creation",
3150
- " or file-consumption edge between two bundles).",
3151
- "- Changing the sort order or priority logic that drives",
3152
- " dispatcher routing between tiers.",
3153
- "",
3154
- "Edits that do **not** require a diagram update:",
3155
- "",
3156
- "- Typo fixes, comment tweaks, wording polish in rule prose.",
3157
- "- Refactors that preserve the exact phase / handoff graph",
3158
- " (extracting a helper, renaming an internal variable,",
3159
- " reordering imports).",
3160
- "- Updates to supporting metadata (permissions lists, default",
3161
- " paths) that do not change the visible phase flow.",
3162
- "",
3163
- "When a change is borderline \u2014 the phase graph is unchanged but",
3164
- "the diagram's caption or annotation would be more accurate \u2014",
3165
- "err on the side of updating the diagram. The convention favours",
3166
- "over-updating over silent drift.",
3167
- "",
3168
- "## Authoring Checklist",
3169
- "",
3170
- "Authors and reviewers walk the following checklist before",
3171
- "merging any PR that touches a bundle path:",
3172
- "",
3173
- `1. **Did the phase graph change?** If yes, update \`${wd.diagramsPath}\``,
3174
- " in the same PR \u2014 both the affected agent section and, if the",
3175
- " change added or removed a cross-agent handoff, the master",
3176
- " diagram.",
3177
- "2. **Did the diagram render?** Preview the Mermaid block locally",
3178
- " (or via the docs site's dev server) and confirm it renders",
3179
- " without syntax errors.",
3180
- `3. **Is the section heading stable?** Each agent section uses a`,
3181
- " `## N. <agent-name>` heading where `<agent-name>` matches the",
3182
- " bundle name / agent prompt filename. Keep the headings stable",
3183
- " \u2014 downstream tooling may match on them.",
3184
- "4. **Does the legend still apply?** If a new arrow style or node",
3185
- " colour was introduced, document it in the legend.",
3186
- ""
3187
- ];
3188
- if (wd.emitChecker) {
3189
- lines.push(
3190
- "## Automated Check",
3191
- "",
3192
- `The bundled \`.claude/procedures/check-workflow-diagrams.sh\``,
3193
- "helper enforces the rule mechanically. Given a set of changed",
3194
- "files (as a newline-separated list on stdin, or positional",
3195
- `arguments), it fails non-zero when any file matches a`,
3196
- `bundle-path pattern and \`${wd.diagramsPath}\` is not also in`,
3197
- "the list. Wire it into a pre-commit hook or CI job as needed:",
3198
- "",
3199
- "```bash",
3200
- "# Pre-commit (staged files):",
3201
- "git diff --cached --name-only \\",
3202
- " | .claude/procedures/check-workflow-diagrams.sh",
3203
- "",
3204
- "# CI (branch-vs-base):",
3205
- "git diff --name-only origin/main...HEAD \\",
3206
- " | .claude/procedures/check-workflow-diagrams.sh",
3207
- "```",
3208
- "",
3209
- "The helper exits with a descriptive diagnostic on failure, so",
3210
- "it plugs directly into any hook framework without further",
3211
- "glue. It exits `0` when no bundle files were touched or when",
3212
- "the diagrams file is also present in the change set.",
3213
- ""
3214
- );
3215
- }
3216
- lines.push(
3217
- "## Out of Scope",
3218
- "",
3219
- "The convention intentionally does not:",
3220
- "",
3221
- "- Auto-generate the diagrams \u2014 readability is the point.",
3222
- "- Enforce a specific Mermaid sub-grammar beyond `flowchart TD`",
3223
- " for per-agent sections. Sequence diagrams, state diagrams, or",
3224
- " class diagrams are fine for bespoke sections as long as they",
3225
- " render.",
3226
- "- Gate every unrelated cleanup PR on a diagram touch. The rule",
3227
- " targets phase-graph-affecting edits; pure cleanups documented",
3228
- " as such are exempt."
3229
- );
3230
- return lines.join("\n");
3231
- }
3232
- function renderWorkflowDiagramsBundleHook(wd, bundleLabel) {
3233
- if (!wd.enabled) {
3234
- return "";
3235
- }
3236
- const verb = wd.requireDiagramUpdate ? "must" : "should";
3237
- return [
3238
- "## Workflow Diagram",
3239
- "",
3240
- `Every ${bundleLabel} change that modifies the phase graph,`,
3241
- "decision branches, or cross-agent handoffs documented by this",
3242
- `bundle ${verb} also update the matching section in`,
3243
- `\`${wd.diagramsPath}\` in the same PR. See the`,
3244
- "`workflow-diagrams-convention` rule for the full authoring",
3245
- "checklist, the path patterns the rule covers, and what counts",
3246
- "as a phase-graph change vs. a cosmetic edit."
3247
- ].join("\n");
3248
- }
3249
- function renderWorkflowDiagramsStarterPage(_wd) {
3250
- return [
3251
- "---",
3252
- "title: Agent Workflows",
3253
- "description: Hand-authored Mermaid diagrams for every agent pipeline and every cross-agent handoff.",
3254
- "---",
3255
- "",
3256
- "# Agent Workflows",
3257
- "",
3258
- "Each diagram shows every input, decision point, output path, and",
3259
- "downstream issue created by the agent. Solid arrows are issue-",
3260
- "creation handoffs; dashed arrows are file-consumption handoffs.",
3261
- "",
3262
- "Update this page in the same PR that changes a bundle's phase",
3263
- "graph \u2014 see the `workflow-diagrams-convention` rule for the full",
3264
- "contract.",
3265
- "",
3266
- "## Master Cross-Agent Diagram",
3267
- "",
3268
- "```mermaid",
3269
- "flowchart TB",
3270
- " %% Replace the placeholder below with the real agent ecosystem.",
3271
- " DISPATCHER[Dispatcher]",
3272
- " AGENT_A[Agent A]",
3273
- " AGENT_B[Agent B]",
3274
- " DISPATCHER --> AGENT_A",
3275
- " DISPATCHER --> AGENT_B",
3276
- " AGENT_A -->|issue-creation| AGENT_B",
3277
- " AGENT_B -.->|file-consumption| AGENT_A",
3278
- "```",
3279
- "",
3280
- "## 1. Example Agent",
3281
- "",
3282
- "```mermaid",
3283
- "flowchart TD",
3284
- " START([Session Start]) --> CLAIM[Claim issue]",
3285
- " CLAIM --> PHASE{Phase label?}",
3286
- " PHASE -->|phase:a| A1[Phase A work]",
3287
- " PHASE -->|phase:b| B1[Phase B work]",
3288
- " A1 --> COMMIT[Commit & PR]",
3289
- " B1 --> COMMIT",
3290
- " COMMIT --> STOP([Stop])",
3291
- " style STOP fill:#e8f5e9,stroke:#2e7d32",
3292
- "```",
3293
- "",
3294
- "## Legend",
3295
- "",
3296
- "| Style | Meaning |",
3297
- "|-------|---------|",
3298
- "| Solid arrow | Issue-creation handoff (agent A creates an issue for agent B) |",
3299
- "| Dashed arrow | File-consumption handoff (agent A reads files produced by agent B) |",
3300
- "| Green end-node | Terminal state (session complete) |"
3301
- ].join("\n");
3302
- }
3303
- function renderWorkflowDiagramsCheckerScript(wd) {
3304
- const patternsLiteral = wd.bundlePathPatterns.map((p) => ` ${JSON.stringify(p)}`).join("\n");
3305
- return [
3306
- "#!/usr/bin/env bash",
3307
- "# check-workflow-diagrams.sh \u2014 Enforce the diagram-touched-when-bundle-touched rule.",
3308
- "#",
3309
- "# Usage:",
3310
- "# .claude/procedures/check-workflow-diagrams.sh <file>...",
3311
- "# git diff --name-only HEAD | .claude/procedures/check-workflow-diagrams.sh",
3312
- "#",
3313
- "# Exits 0 when the workflow-diagrams page was touched alongside any",
3314
- "# bundle file in the change set, or when no bundle files were touched.",
3315
- "# Exits non-zero with a descriptive diagnostic on failure.",
3316
- "#",
3317
- "# The bundle-path patterns and diagrams path are rendered from the",
3318
- "# consumer's WorkflowDiagramsConfig at synth time \u2014 do not edit by",
3319
- "# hand; regenerate via `pnpm exec projen`.",
3320
- "#",
3321
- "# Patterns support the `**` recursive-segment wildcard even though",
3322
- "# bash's native `[[ $file == $glob ]]` pattern matching does not:",
3323
- "# each glob is converted to a POSIX-extended regex internally and",
3324
- "# matched with `=~`, so the script works uniformly on bash 3.2",
3325
- "# (macOS default) and bash 4+ (Linux / CI) without depending on",
3326
- "# `shopt -s globstar` (which only affects pathname expansion, not",
3327
- "# `[[ ]]` pattern matching).",
3328
- "",
3329
- "set -uo pipefail",
3330
- "",
3331
- "err() {",
3332
- ' printf "check-workflow-diagrams.sh: %s\\n" "$*" >&2',
3333
- "}",
3334
- "",
3335
- `diagrams_path=${JSON.stringify(wd.diagramsPath)}`,
3336
- "",
3337
- "# Bundle-path glob patterns. Translated to anchored POSIX-extended",
3338
- "# regexes at runtime by `glob_to_regex` below so `**` matches",
3339
- "# recursively across path segments.",
3340
- "bundle_patterns=(",
3341
- patternsLiteral,
3342
- ")",
3343
- "",
3344
- "# Convert a bash-style glob into an anchored POSIX-extended regex:",
3345
- "# **/ \u2192 (.+/)? (zero or more path segments plus trailing slash)",
3346
- "# ** \u2192 .* (anywhere, including `/`)",
3347
- "# * \u2192 [^/]* (single path segment)",
3348
- "# ? \u2192 [^/] (single non-slash char)",
3349
- "# Every other char is passed through, with regex metacharacters",
3350
- "# backslash-escaped so literal `.` / `+` / `(` etc. match themselves.",
3351
- "glob_to_regex() {",
3352
- ' local glob="$1"',
3353
- ' local regex=""',
3354
- " local i=0",
3355
- " local len=${#glob}",
3356
- " while (( i < len )); do",
3357
- ' local c="${glob:i:1}"',
3358
- ' if [[ "$c" == "*" ]]; then',
3359
- ' local next="${glob:i+1:1}"',
3360
- ' if [[ "$next" == "*" ]]; then',
3361
- " # `**` \u2014 recursive segment wildcard.",
3362
- ' local after="${glob:i+2:1}"',
3363
- ' if [[ "$after" == "/" ]]; then',
3364
- ' regex+="(.+/)?"',
3365
- " i=$(( i + 3 ))",
3366
- " else",
3367
- ' regex+=".*"',
3368
- " i=$(( i + 2 ))",
3369
- " fi",
3370
- " else",
3371
- ' regex+="[^/]*"',
3372
- " i=$(( i + 1 ))",
3373
- " fi",
3374
- ' elif [[ "$c" == "?" ]]; then',
3375
- ' regex+="[^/]"',
3376
- " i=$(( i + 1 ))",
3377
- " else",
3378
- ' case "$c" in',
3379
- " # Regex metacharacters \u2014 escape to match literally.",
3380
- " '.'|'+'|'^'|'$'|'('|')'|'{'|'}'|'|'|'['|']'|'\\\\')",
3381
- ' regex+="\\\\$c"',
3382
- " ;;",
3383
- " *)",
3384
- ' regex+="$c"',
3385
- " ;;",
3386
- " esac",
3387
- " i=$(( i + 1 ))",
3388
- " fi",
3389
- " done",
3390
- ' printf "^%s$" "$regex"',
3391
- "}",
3392
- "",
3393
- "# Collect the input file list: positional args override stdin.",
3394
- "if [[ $# -gt 0 ]]; then",
3395
- ' files=("$@")',
3396
- "else",
3397
- " files=()",
3398
- " while IFS= read -r line; do",
3399
- ' [[ -z "$line" ]] && continue',
3400
- ' files+=("$line")',
3401
- " done",
3402
- "fi",
3403
- "",
3404
- "if [[ ${#files[@]} -eq 0 ]]; then",
3405
- " # No input \u2014 nothing to check.",
3406
- " exit 0",
3407
- "fi",
3408
- "",
3409
- "# Precompile each bundle pattern to a regex once.",
3410
- "bundle_regexes=()",
3411
- 'for pattern in "${bundle_patterns[@]}"; do',
3412
- ' bundle_regexes+=("$(glob_to_regex "$pattern")")',
3413
- "done",
3414
- "",
3415
- "bundle_touched=0",
3416
- "matched_bundle=''",
3417
- "diagrams_touched=0",
3418
- "",
3419
- 'for file in "${files[@]}"; do',
3420
- ' if [[ "$file" == "$diagrams_path" ]]; then',
3421
- " diagrams_touched=1",
3422
- " continue",
3423
- " fi",
3424
- ' for regex in "${bundle_regexes[@]}"; do',
3425
- ' if [[ "$file" =~ $regex ]]; then',
3426
- " bundle_touched=1",
3427
- ' matched_bundle="$file"',
3428
- " break",
3429
- " fi",
3430
- " done",
3431
- "done",
3432
- "",
3433
- 'if [[ "$bundle_touched" -eq 1 && "$diagrams_touched" -eq 0 ]]; then',
3434
- ` err "bundle file '$matched_bundle' was modified but '$diagrams_path' was not"`,
3435
- ' err "update the workflow-diagrams page in the same change set (see workflow-diagrams-convention rule)"',
3436
- " exit 1",
3437
- "fi",
3438
- "",
3439
- "exit 0"
3440
- ].join("\n");
3441
- }
3442
- function assertValidDiagramsPath(value) {
3443
- if (typeof value !== "string" || value.trim().length === 0) {
3444
- throw new Error(
3445
- `WorkflowDiagramsConfig.diagramsPath must be a non-empty string; got ${JSON.stringify(
3446
- value
3447
- )}`
3448
- );
3449
- }
3450
- if (value.startsWith("/")) {
3451
- throw new Error(
3452
- `WorkflowDiagramsConfig.diagramsPath must be a repo-relative path (no leading '/'); got ${JSON.stringify(
3453
- value
3454
- )}`
3455
- );
3456
- }
3457
- }
3458
- function assertValidBundlePathPatterns2(value) {
3459
- if (!Array.isArray(value)) {
3460
- throw new Error(
3461
- `WorkflowDiagramsConfig.bundlePathPatterns must be an array; got ${JSON.stringify(
3462
- value
3463
- )}`
3464
- );
3465
- }
3466
- if (value.length === 0) {
3467
- throw new Error(
3468
- "WorkflowDiagramsConfig.bundlePathPatterns must not be empty \u2014 supply at least one pattern or omit the field to use the defaults"
3469
- );
3470
- }
3471
- for (const entry of value) {
3472
- if (typeof entry !== "string" || entry.trim().length === 0) {
3473
- throw new Error(
3474
- `WorkflowDiagramsConfig.bundlePathPatterns entries must be non-empty strings; got ${JSON.stringify(
3475
- entry
3476
- )}`
3477
- );
3478
- }
3479
- }
3480
- }
3481
-
3482
3042
  // src/agent/bundles/base.ts
3483
3043
  var createPackageSkill = {
3484
3044
  name: "create-package",
@@ -4556,16 +4116,6 @@ function buildBaseBundle(paths = DEFAULT_AGENT_PATHS) {
4556
4116
  },
4557
4117
  tags: ["workflow"]
4558
4118
  },
4559
- {
4560
- name: "workflow-diagrams-convention",
4561
- description: `Workflow-diagrams convention: hand-authored Mermaid page under \`${paths.docsRoot}/agents/workflows.md\` with one diagram per agent plus a master cross-agent diagram, and the diagram-touched-when-bundle-touched rule that keeps the page in sync with every phase-graph or cross-agent-handoff change.`,
4562
- scope: AGENT_RULE_SCOPE.ALWAYS,
4563
- content: renderWorkflowDiagramsRuleContent(resolveWorkflowDiagrams()),
4564
- platforms: {
4565
- cursor: { exclude: true }
4566
- },
4567
- tags: ["workflow"]
4568
- },
4569
4119
  {
4570
4120
  name: "issue-templates-convention",
4571
4121
  description: `Issue-templates convention: a single hand-authored reference page under \`${paths.docsRoot}/agents/issue-templates.md\` that carries one canonical \`gh issue create\` recipe per downstream phase label, and the reference-don't-inline rule that keeps bundle rules and agent prompts citing that page instead of duplicating full template invocations.`,
@@ -5305,12 +4855,12 @@ function buildBcmWriterBundle(paths = DEFAULT_AGENT_PATHS) {
5305
4855
  {
5306
4856
  name: "bcm:context",
5307
4857
  color: "D4C5F9",
5308
- description: "Phase 3: fill Project Relevance, Value Stream Mapping, Enabling Software Systems, Roles Involved, and Company Size Applicability"
4858
+ description: "Phase 3: fill Project Relevance, Value Stream Mapping, Software Systems, Roles, and Company Size"
5309
4859
  },
5310
4860
  {
5311
4861
  name: "bcm:connect",
5312
4862
  color: "FEF2C0",
5313
- description: "Phase 4: cross-link with parent/siblings, update registry and capability-map, open downstream research issues"
4863
+ description: "Phase 4: cross-link parent/siblings, update registry and capability-map, open downstream issues"
5314
4864
  }
5315
4865
  ]
5316
4866
  };
@@ -6305,7 +5855,7 @@ function buildBusinessModelsBundle(paths = DEFAULT_AGENT_PATHS) {
6305
5855
  {
6306
5856
  name: "type:business-model",
6307
5857
  color: "5319E7",
6308
- description: "Work that authors or updates a Business Model Canvas plus BIZBOK value streams for an industry segment"
5858
+ description: "Authors or updates a Business Model Canvas plus BIZBOK value streams for an industry segment"
6309
5859
  },
6310
5860
  {
6311
5861
  name: "business-models:scan",
@@ -8644,22 +8194,22 @@ function buildCustomerProfileBundle(paths = DEFAULT_AGENT_PATHS) {
8644
8194
  {
8645
8195
  name: "type:customer-profile",
8646
8196
  color: "5319E7",
8647
- description: "Work that researches a customer archetype: discovery across a scope, deep profile of one archetype, or feature-to-need competitor analysis for one archetype"
8197
+ description: "Researches a customer archetype: discovery, deep profile, or competitor analysis"
8648
8198
  },
8649
8199
  {
8650
8200
  name: "customer:discover",
8651
8201
  color: "C5DEF5",
8652
- description: "Phase 1: scan existing documentation for customer archetype candidates and write a discovery report; create downstream profile issues"
8202
+ description: "Phase 1: scan docs for archetype candidates, write discovery report, create profile issues"
8653
8203
  },
8654
8204
  {
8655
8205
  name: "customer:profile",
8656
8206
  color: "BFDADC",
8657
- description: "Phase 2: research one archetype in depth and populate the archetype page with segment, goals, jobs-to-be-done, constraints, buying process, and technology landscape"
8207
+ description: "Phase 2: deep-research one archetype: segment, goals, JTBD, constraints, buying process, tech"
8658
8208
  },
8659
8209
  {
8660
8210
  name: "customer:competitors",
8661
8211
  color: "D4C5F9",
8662
- description: "Phase 3: map shared feature-matrix rows to archetype needs, identify unmet needs, and hand off req:scan seeds to the requirements-analyst bundle"
8212
+ description: "Phase 3: map feature-matrix rows to archetype needs and hand off req:scan seeds"
8663
8213
  }
8664
8214
  ]
8665
8215
  };
@@ -9526,22 +9076,22 @@ function buildDocsSyncBundle(paths = DEFAULT_AGENT_PATHS) {
9526
9076
  {
9527
9077
  name: "docs-sync:scan",
9528
9078
  color: "C5DEF5",
9529
- description: "Phase 1: scan code and docs for drift (API diff, TSDoc coverage, reference integrity, link integrity, code-sample compilation)"
9079
+ description: "Phase 1: scan for drift (API diff, TSDoc coverage, references, links, sample compilation)"
9530
9080
  },
9531
9081
  {
9532
9082
  name: "docs-sync:fix",
9533
9083
  color: "BFDADC",
9534
- description: "Phase 2: apply mechanical idempotent fixes (TSDoc stubs, dead-link updates, registry sync, rename-follow) and file docs:write follow-ups for conceptual changes"
9084
+ description: "Phase 2: apply mechanical fixes and file docs:write follow-ups for conceptual changes"
9535
9085
  },
9536
9086
  {
9537
9087
  name: "docs-sync:advisory",
9538
9088
  color: "FBCA04",
9539
- description: "Drift detected by docs-sync but does not block the PR; surfaced as a non-blocking note on the sticky comment"
9089
+ description: "Drift detected by docs-sync but does not block the PR; surfaced as a sticky-comment note"
9540
9090
  },
9541
9091
  {
9542
9092
  name: "docs-sync:blocking",
9543
9093
  color: "B60205",
9544
- description: "Drift detected by docs-sync blocks the PR; applied together with review:human-required so pr-reviewer owns the merge gate"
9094
+ description: "Drift blocks the PR; applied with review:human-required so pr-reviewer owns the merge gate"
9545
9095
  }
9546
9096
  ]
9547
9097
  };
@@ -11136,7 +10686,7 @@ function buildMaintenanceAuditBundle(paths = DEFAULT_AGENT_PATHS) {
11136
10686
  {
11137
10687
  name: "maint:verify",
11138
10688
  color: "D4C5F9",
11139
- description: "Phase 3: re-run the scan checks scoped to the paths the fix phase touched, compare pre/post findings, and close or re-queue the parent scan"
10689
+ description: "Phase 3: re-run scan checks scoped to fix-phase paths, compare findings, close or re-queue scan"
11140
10690
  }
11141
10691
  ]
11142
10692
  };
@@ -15675,7 +15225,7 @@ function buildPeopleProfileBundle(paths = DEFAULT_AGENT_PATHS) {
15675
15225
  {
15676
15226
  name: "people:followup",
15677
15227
  color: "D4C5F9",
15678
- description: "Phase 3: cross-link the profile to existing companies, software, and meeting notes, and enqueue follow-up research issues for unprofiled companies and software products"
15228
+ description: "Phase 3: cross-link profile to companies/software/meetings; enqueue follow-up research issues"
15679
15229
  },
15680
15230
  {
15681
15231
  name: "people:refresh",
@@ -18475,22 +18025,22 @@ function buildRegulatoryResearchBundle(paths = DEFAULT_AGENT_PATHS) {
18475
18025
  {
18476
18026
  name: "type:regulatory-research",
18477
18027
  color: "5319E7",
18478
- description: "Work that researches a regulatory compliance obligation: scan of a jurisdictional landscape, deep-dive on one regulation, or impact analysis against the consuming project"
18028
+ description: "Researches a regulatory obligation: jurisdictional scan, deep-dive, or impact analysis"
18479
18029
  },
18480
18030
  {
18481
18031
  name: "regulatory:scan",
18482
18032
  color: "C5DEF5",
18483
- description: "Phase 1: enumerate regulations applicable to an industry, jurisdiction, or platform scope; write a scan report; create downstream research issues"
18033
+ description: "Phase 1: enumerate regulations for an industry/jurisdiction/scope; create research issues"
18484
18034
  },
18485
18035
  {
18486
18036
  name: "regulatory:research",
18487
18037
  color: "BFDADC",
18488
- description: "Phase 2: research one regulation in depth and populate the regulation page with scope, triggers, requirements, jurisdiction variations, enforcement, and penalties"
18038
+ description: "Phase 2: research one regulation in depth (scope, triggers, requirements, enforcement)"
18489
18039
  },
18490
18040
  {
18491
18041
  name: "regulatory:impact",
18492
18042
  color: "D4C5F9",
18493
- description: "Phase 3: assess product impact against one regulation and hand off actionable obligations as SEC req:scan seeds to the requirements-analyst bundle"
18043
+ description: "Phase 3: assess product impact and hand off SEC req:scan seeds to requirements-analyst"
18494
18044
  }
18495
18045
  ]
18496
18046
  };
@@ -21767,7 +21317,7 @@ function buildRequirementsWriterBundle(paths = DEFAULT_AGENT_PATHS) {
21767
21317
  {
21768
21318
  name: "tier:customer-workflow",
21769
21319
  color: "EDEDED",
21770
- description: "Architectural tier: customer-configured workflow (business logic tenants configure within the platform)"
21320
+ description: "Architectural tier: customer-configured workflow (business logic tenants configure)"
21771
21321
  },
21772
21322
  {
21773
21323
  name: "tier:consumer-app",
@@ -23167,7 +22717,7 @@ function buildRequirementsReviewerBundle(paths = DEFAULT_AGENT_PATHS) {
23167
22717
  {
23168
22718
  name: "req:deprecate",
23169
22719
  color: "D93F0B",
23170
- description: "Phase: transition existing requirement documents to Deprecated or Superseded using the requirements-reviewer skill"
22720
+ description: "Phase: transition requirement docs to Deprecated/Superseded via the requirements-reviewer"
23171
22721
  }
23172
22722
  ]
23173
22723
  };
@@ -24821,7 +24371,7 @@ function buildSoftwareProfileBundle(paths = DEFAULT_AGENT_PATHS) {
24821
24371
  {
24822
24372
  name: "type:software-profile",
24823
24373
  color: "0E8A16",
24824
- description: "Work that produces or maintains a software profile, research notes, feature-matrix rows, or capability mappings"
24374
+ description: "Produces a software profile, research notes, feature-matrix rows, or capability mappings"
24825
24375
  },
24826
24376
  {
24827
24377
  name: "software:research",
@@ -24841,12 +24391,12 @@ function buildSoftwareProfileBundle(paths = DEFAULT_AGENT_PATHS) {
24841
24391
  {
24842
24392
  name: "software:map",
24843
24393
  color: "A2EEEF",
24844
- description: "Phase 4: map each feature back to the BCM capability model, write the mapping onto the profile, and enqueue `bcm:outline` issues for unmapped features above the configured threshold"
24394
+ description: "Phase 4: map features to the BCM model and enqueue bcm:outline issues for unmapped features"
24845
24395
  },
24846
24396
  {
24847
24397
  name: "software:followup",
24848
24398
  color: "FBCA04",
24849
- description: "Phase 5: enqueue follow-up research issues for adjacent products, the vendor company, and primary-attribution people surfaced in the profile"
24399
+ description: "Phase 5: enqueue follow-up research for adjacent products, vendor company, and key people"
24850
24400
  }
24851
24401
  ]
24852
24402
  };
@@ -26173,32 +25723,32 @@ function buildStandardsResearchBundle(paths = DEFAULT_AGENT_PATHS) {
26173
25723
  {
26174
25724
  name: "type:standards-research",
26175
25725
  color: "5319E7",
26176
- description: "Work that researches an interoperability standard: version research, cross-version comparison, extension analysis, or standards-body organization profiling"
25726
+ description: "Researches an interoperability standard: versions, comparison, extension, or org profile"
26177
25727
  },
26178
25728
  {
26179
25729
  name: "standards:scope",
26180
25730
  color: "C5DEF5",
26181
- description: "Phase 1: plan the research campaign for one standard; write the query plan; create downstream research, compare, and organizations issues"
25731
+ description: "Phase 1: plan a standard's research campaign; write query plan; create downstream issues"
26182
25732
  },
26183
25733
  {
26184
25734
  name: "standards:research",
26185
25735
  color: "BFDADC",
26186
- description: "Phase 2: research one version of the standard and populate the version page with status, key changes, resources, adoption, and governance touch-points"
25736
+ description: "Phase 2: research one version (status, key changes, resources, adoption, governance)"
26187
25737
  },
26188
25738
  {
26189
25739
  name: "standards:compare",
26190
25740
  color: "D4C5F9",
26191
- description: "Phase 3: synthesize a cross-version comparison on the standard's overview page \u2014 version timeline, maturity progression, breaking changes, migration paths"
25741
+ description: "Phase 3: synthesize cross-version comparison: timeline, maturity, breaking changes, migration"
26192
25742
  },
26193
25743
  {
26194
25744
  name: "standards:extension",
26195
25745
  color: "FBCA04",
26196
- description: "Phase 4: analyze the extension mechanism needed for one domain entity whose base-spec mapping is Partial or Gap; hand off a Proposed ADR to the requirements pipeline"
25746
+ description: "Phase 4: analyze extension for one Partial/Gap entity; hand off Proposed ADR to requirements"
26197
25747
  },
26198
25748
  {
26199
25749
  name: "standards:organizations",
26200
25750
  color: "0E8A16",
26201
- description: "Phase 5: profile one standards-body organization's role in the standard; hand off canonical company and people profiles to the profile bundles"
25751
+ description: "Phase 5: profile one standards-body organization; hand off company/people profile issues"
26202
25752
  }
26203
25753
  ]
26204
25754
  };
@@ -27260,8 +26810,8 @@ var FALLBACKS = {
27260
26810
  monorepoLayoutSeedBlock: ""
27261
26811
  };
27262
26812
  var TEMPLATE_RE = /\{\{(\w+(?:\.\w+)*)\}\}/g;
27263
- function getNestedValue(obj, path7) {
27264
- const parts = path7.split(".");
26813
+ function getNestedValue(obj, path8) {
26814
+ const parts = path8.split(".");
27265
26815
  let current = obj;
27266
26816
  for (const part of parts) {
27267
26817
  if (current == null || typeof current !== "object") {
@@ -27956,26 +27506,6 @@ var SKILL_EVALS_BUNDLE_HOOKS = [
27956
27506
  ["requirements-analyst-workflow", "requirements-analyst"],
27957
27507
  ["requirements-writer-workflow", "write-requirement"]
27958
27508
  ];
27959
- var WORKFLOW_DIAGRAMS_BUNDLE_HOOKS = [
27960
- ["bcm-writer-workflow", "bcm-writer"],
27961
- ["business-models-workflow", "business-models"],
27962
- ["company-profile-workflow", "company-profile"],
27963
- ["customer-profile-workflow", "customer-profile"],
27964
- ["industry-discovery-workflow", "industry-discovery"],
27965
- ["maintenance-audit-workflow", "maintenance-audit"],
27966
- ["meeting-agenda-workflow", "agenda"],
27967
- ["meeting-processing-workflow", "meeting-analysis"],
27968
- ["orchestrator-conventions", "orchestrator"],
27969
- ["people-profile-workflow", "people-profile"],
27970
- ["pr-review-workflow", "pr-review"],
27971
- ["regulatory-research-workflow", "regulatory-research"],
27972
- ["requirements-analyst-workflow", "requirements-analyst"],
27973
- ["requirements-reviewer-workflow", "requirements-reviewer"],
27974
- ["requirements-writer-workflow", "requirements-writer"],
27975
- ["research-pipeline-workflow", "research-pipeline"],
27976
- ["software-profile-workflow", "software-profile"],
27977
- ["standards-research-workflow", "standards-research"]
27978
- ];
27979
27509
  var ISSUE_TEMPLATES_BUNDLE_HOOKS = [
27980
27510
  ["bcm-writer-workflow", "bcm-writer"],
27981
27511
  ["business-models-workflow", "business-models"],
@@ -28147,24 +27677,6 @@ var AgentConfig = class _AgentConfig extends import_projen8.Component {
28147
27677
  executable: true
28148
27678
  });
28149
27679
  }
28150
- const resolvedWorkflowDiagrams = validateWorkflowDiagramsConfig(
28151
- this.options.workflowDiagrams
28152
- );
28153
- if (resolvedWorkflowDiagrams.enabled) {
28154
- if (resolvedWorkflowDiagrams.emitChecker) {
28155
- new import_projen8.TextFile(this, ".claude/procedures/check-workflow-diagrams.sh", {
28156
- lines: renderWorkflowDiagramsCheckerScript(
28157
- resolvedWorkflowDiagrams
28158
- ).split("\n"),
28159
- executable: true
28160
- });
28161
- }
28162
- if (resolvedWorkflowDiagrams.emitStarterDiagram) {
28163
- new import_projen8.SampleFile(this.project, resolvedWorkflowDiagrams.diagramsPath, {
28164
- contents: renderWorkflowDiagramsStarterPage(resolvedWorkflowDiagrams)
28165
- });
28166
- }
28167
- }
28168
27680
  const resolvedIssueTemplates = validateIssueTemplatesConfig(
28169
27681
  this.options.issueTemplates
28170
27682
  );
@@ -28477,46 +27989,6 @@ ${hook}`
28477
27989
 
28478
27990
  ---
28479
27991
 
28480
- ${hook}`
28481
- });
28482
- }
28483
- }
28484
- const resolvedWorkflowDiagramsForRules = resolveWorkflowDiagrams(
28485
- this.options.workflowDiagrams
28486
- );
28487
- if (this.options.workflowDiagrams) {
28488
- const workflowDiagramsRule = ruleMap.get("workflow-diagrams-convention");
28489
- if (workflowDiagramsRule) {
28490
- const workflowDiagramsContent = renderWorkflowDiagramsRuleContent(
28491
- resolvedWorkflowDiagramsForRules
28492
- );
28493
- if (workflowDiagramsContent !== workflowDiagramsRule.content) {
28494
- ruleMap.set("workflow-diagrams-convention", {
28495
- ...workflowDiagramsRule,
28496
- content: workflowDiagramsContent
28497
- });
28498
- }
28499
- }
28500
- }
28501
- if (resolvedWorkflowDiagramsForRules.enabled) {
28502
- for (const [ruleName, label] of WORKFLOW_DIAGRAMS_BUNDLE_HOOKS) {
28503
- const existing = ruleMap.get(ruleName);
28504
- if (!existing) {
28505
- continue;
28506
- }
28507
- const hook = renderWorkflowDiagramsBundleHook(
28508
- resolvedWorkflowDiagramsForRules,
28509
- label
28510
- );
28511
- if (hook.length === 0) {
28512
- continue;
28513
- }
28514
- ruleMap.set(ruleName, {
28515
- ...existing,
28516
- content: `${existing.content}
28517
-
28518
- ---
28519
-
28520
27992
  ${hook}`
28521
27993
  });
28522
27994
  }
@@ -29948,9 +29420,388 @@ function auditReportJsonSchema() {
29948
29420
  };
29949
29421
  }
29950
29422
 
29423
+ // src/docs-sync/scan/checks/api-diff-check.ts
29424
+ function parseApiRollup(rollup) {
29425
+ const fenceContents = extractFirstTsFence(rollup);
29426
+ if (fenceContents === void 0) {
29427
+ return [];
29428
+ }
29429
+ const lines = fenceContents.split("\n");
29430
+ const entries = [];
29431
+ let i = 0;
29432
+ while (i < lines.length) {
29433
+ const line = lines[i];
29434
+ const trimmed = line.trim();
29435
+ if (!trimmed.startsWith("export ")) {
29436
+ i += 1;
29437
+ continue;
29438
+ }
29439
+ const startIndex = i;
29440
+ let buffer = trimmed;
29441
+ let braceDepth = countBraceDelta(trimmed);
29442
+ let endsWithSemicolon = trimmed.endsWith(";");
29443
+ i += 1;
29444
+ while (i < lines.length && !isComplete(buffer, braceDepth, endsWithSemicolon)) {
29445
+ const next = lines[i];
29446
+ const nextTrimmed = next.trim();
29447
+ if (nextTrimmed.length === 0 || nextTrimmed.startsWith("//")) {
29448
+ i += 1;
29449
+ continue;
29450
+ }
29451
+ buffer = `${buffer} ${nextTrimmed}`;
29452
+ braceDepth += countBraceDelta(nextTrimmed);
29453
+ endsWithSemicolon = nextTrimmed.endsWith(";");
29454
+ i += 1;
29455
+ }
29456
+ const normalized = normalizeWhitespace(buffer);
29457
+ const name = extractDeclarationName(normalized);
29458
+ if (name) {
29459
+ entries.push({ name, signature: normalized });
29460
+ }
29461
+ if (name && normalized.startsWith("export {")) {
29462
+ const names = extractExportListNames(normalized);
29463
+ if (names.length > 1) {
29464
+ entries.pop();
29465
+ for (const exportName of names) {
29466
+ entries.push({ name: exportName, signature: normalized });
29467
+ }
29468
+ }
29469
+ }
29470
+ if (i === startIndex) {
29471
+ i += 1;
29472
+ }
29473
+ }
29474
+ const dedup = /* @__PURE__ */ new Map();
29475
+ for (const entry of entries) {
29476
+ if (!dedup.has(entry.name)) {
29477
+ dedup.set(entry.name, entry);
29478
+ }
29479
+ }
29480
+ return Array.from(dedup.values()).sort(
29481
+ (a, b) => a.name.localeCompare(b.name)
29482
+ );
29483
+ }
29484
+ function diffApiRollups(baselineRollup, currentRollup) {
29485
+ const baseline = /* @__PURE__ */ new Map();
29486
+ for (const entry of parseApiRollup(baselineRollup)) {
29487
+ baseline.set(entry.name, entry);
29488
+ }
29489
+ const current = /* @__PURE__ */ new Map();
29490
+ for (const entry of parseApiRollup(currentRollup)) {
29491
+ current.set(entry.name, entry);
29492
+ }
29493
+ const added = [];
29494
+ const removed = [];
29495
+ const changed = [];
29496
+ for (const [name, entry] of current.entries()) {
29497
+ const before = baseline.get(name);
29498
+ if (!before) {
29499
+ added.push(entry);
29500
+ continue;
29501
+ }
29502
+ if (before.signature !== entry.signature) {
29503
+ changed.push(entry);
29504
+ }
29505
+ }
29506
+ for (const [name, entry] of baseline.entries()) {
29507
+ if (!current.has(name)) {
29508
+ removed.push(entry);
29509
+ }
29510
+ }
29511
+ added.sort((a, b) => a.name.localeCompare(b.name));
29512
+ removed.sort((a, b) => a.name.localeCompare(b.name));
29513
+ changed.sort((a, b) => a.name.localeCompare(b.name));
29514
+ return { added, removed, changed };
29515
+ }
29516
+ function createApiDiffCheck(options) {
29517
+ const baseline = options.baselineRollup;
29518
+ const current = options.currentRollup;
29519
+ const rollupPath = options.rollupPath ?? "";
29520
+ return {
29521
+ name: options.name ?? "apiDiff",
29522
+ run(_context) {
29523
+ const diff = diffApiRollups(baseline, current);
29524
+ const findings = [];
29525
+ for (const entry of diff.added) {
29526
+ findings.push({
29527
+ category: AuditCategory.ApiDiff,
29528
+ severity: AuditSeverity.Mechanical,
29529
+ location: { file: rollupPath, line: 0 },
29530
+ subject: entry.name,
29531
+ details: `New public export \`${entry.name}\` not present in baseline rollup.`,
29532
+ change: "added",
29533
+ symbol: entry.name,
29534
+ fixHint: "stub-tsdoc"
29535
+ });
29536
+ }
29537
+ for (const entry of diff.removed) {
29538
+ findings.push({
29539
+ category: AuditCategory.ApiDiff,
29540
+ severity: AuditSeverity.Advisory,
29541
+ location: { file: rollupPath, line: 0 },
29542
+ subject: entry.name,
29543
+ details: `Public export \`${entry.name}\` was present in baseline rollup but is gone in the current rollup.`,
29544
+ change: "removed",
29545
+ symbol: entry.name
29546
+ });
29547
+ }
29548
+ for (const entry of diff.changed) {
29549
+ findings.push({
29550
+ category: AuditCategory.ApiDiff,
29551
+ severity: AuditSeverity.Advisory,
29552
+ location: { file: rollupPath, line: 0 },
29553
+ subject: entry.name,
29554
+ details: `Public export \`${entry.name}\` signature changed since baseline rollup.`,
29555
+ change: "changed",
29556
+ symbol: entry.name
29557
+ });
29558
+ }
29559
+ return findings;
29560
+ }
29561
+ };
29562
+ }
29563
+ function extractFirstTsFence(rollup) {
29564
+ const lines = rollup.split("\n");
29565
+ let start = -1;
29566
+ for (let i = 0; i < lines.length; i++) {
29567
+ const line = lines[i].trim();
29568
+ if (line === "```ts" || line === "```typescript") {
29569
+ start = i + 1;
29570
+ break;
29571
+ }
29572
+ }
29573
+ if (start < 0) {
29574
+ return void 0;
29575
+ }
29576
+ for (let j = start; j < lines.length; j++) {
29577
+ if (lines[j].trim() === "```") {
29578
+ return lines.slice(start, j).join("\n");
29579
+ }
29580
+ }
29581
+ return lines.slice(start).join("\n");
29582
+ }
29583
+ function countBraceDelta(line) {
29584
+ let delta = 0;
29585
+ for (const ch of line) {
29586
+ if (ch === "{") {
29587
+ delta += 1;
29588
+ } else if (ch === "}") {
29589
+ delta -= 1;
29590
+ }
29591
+ }
29592
+ return delta;
29593
+ }
29594
+ function isComplete(buffer, braceDepth, endsWithSemicolon) {
29595
+ if (braceDepth > 0) {
29596
+ return false;
29597
+ }
29598
+ if (endsWithSemicolon) {
29599
+ return true;
29600
+ }
29601
+ return buffer.trimEnd().endsWith("}");
29602
+ }
29603
+ function normalizeWhitespace(s) {
29604
+ return s.replace(/\s+/g, " ").replace(/\(\s+/g, "(").replace(/\s+\)/g, ")").replace(/\[\s+/g, "[").replace(/\s+\]/g, "]").replace(/\{\s+/g, "{").replace(/\s+\}/g, "}").replace(/\s+,/g, ",").replace(/\s+;/g, ";").replace(/\s+:/g, ":").trim();
29605
+ }
29606
+ var DECLARATION_KEYWORDS = [
29607
+ "function",
29608
+ "class",
29609
+ "interface",
29610
+ "type",
29611
+ "enum",
29612
+ "const",
29613
+ "let",
29614
+ "var",
29615
+ "namespace",
29616
+ "abstract",
29617
+ "default",
29618
+ "async"
29619
+ ];
29620
+ function extractDeclarationName(declaration) {
29621
+ const tokens = declaration.split(/\s+/);
29622
+ if (tokens.length === 0 || tokens[0] !== "export") {
29623
+ return void 0;
29624
+ }
29625
+ let cursor = 1;
29626
+ while (cursor < tokens.length && DECLARATION_KEYWORDS.includes(tokens[cursor])) {
29627
+ cursor += 1;
29628
+ }
29629
+ if (cursor >= tokens.length) {
29630
+ return void 0;
29631
+ }
29632
+ const candidate = tokens[cursor];
29633
+ if (candidate.startsWith("{")) {
29634
+ const stripped = candidate.replace(/^\{/, "").replace(/[},].*$/, "");
29635
+ return stripped || void 0;
29636
+ }
29637
+ const cleaned = candidate.replace(/[<(:;].*$/, "");
29638
+ return cleaned || void 0;
29639
+ }
29640
+ function extractExportListNames(declaration) {
29641
+ const open = declaration.indexOf("{");
29642
+ const close = declaration.indexOf("}", open);
29643
+ if (open < 0 || close < 0) {
29644
+ return [];
29645
+ }
29646
+ const inside = declaration.slice(open + 1, close);
29647
+ const names = [];
29648
+ for (const part of inside.split(",")) {
29649
+ const token = part.trim();
29650
+ if (!token) {
29651
+ continue;
29652
+ }
29653
+ const asMatch = token.match(/\sas\s+(\S+)$/);
29654
+ if (asMatch) {
29655
+ names.push(asMatch[1]);
29656
+ } else {
29657
+ names.push(token);
29658
+ }
29659
+ }
29660
+ return names;
29661
+ }
29662
+
29663
+ // src/docs-sync/scan/checks/reference-mismatch-check.ts
29664
+ function referenceRecordToFinding(record, signatureChangedSymbols) {
29665
+ if (signatureChangedSymbols.has(record.symbol)) {
29666
+ return {
29667
+ category: AuditCategory.ReferenceMismatches,
29668
+ severity: AuditSeverity.Advisory,
29669
+ location: { file: record.docPath, line: record.line },
29670
+ subject: record.symbol,
29671
+ details: `Inline reference \`${record.symbol}\` resolves to a symbol whose signature has changed; review the surrounding prose.`,
29672
+ mismatch: "signature-changed",
29673
+ symbol: record.symbol
29674
+ };
29675
+ }
29676
+ if (!record.isKnown) {
29677
+ return {
29678
+ category: AuditCategory.ReferenceMismatches,
29679
+ severity: AuditSeverity.Advisory,
29680
+ location: { file: record.docPath, line: record.line },
29681
+ subject: record.symbol,
29682
+ details: `Inline reference \`${record.symbol}\` does not match any known public export.`,
29683
+ mismatch: "unknown-symbol",
29684
+ symbol: record.symbol
29685
+ };
29686
+ }
29687
+ return void 0;
29688
+ }
29689
+ function createReferenceMismatchCheck(options) {
29690
+ const records = options.records;
29691
+ const signatureChangedSymbols = new Set(
29692
+ options.signatureChangedSymbols ?? []
29693
+ );
29694
+ return {
29695
+ name: options.name ?? "referenceMismatches",
29696
+ run(_context) {
29697
+ const findings = [];
29698
+ for (const record of records) {
29699
+ const finding = referenceRecordToFinding(
29700
+ record,
29701
+ signatureChangedSymbols
29702
+ );
29703
+ if (finding !== void 0) {
29704
+ findings.push(finding);
29705
+ }
29706
+ }
29707
+ return findings;
29708
+ }
29709
+ };
29710
+ }
29711
+
29712
+ // src/docs-sync/scan/checks/tsdoc-coverage-check.ts
29713
+ var path5 = __toESM(require("path"));
29714
+ function tsdocRecordToFindings(record, context) {
29715
+ const findings = [];
29716
+ const file = relativizeFile(record.location.file, context.repoRoot);
29717
+ const line = record.location.line;
29718
+ const symbol = record.symbol;
29719
+ if (!record.hasSummary) {
29720
+ findings.push({
29721
+ category: AuditCategory.TsdocCoverage,
29722
+ severity: AuditSeverity.Mechanical,
29723
+ location: { file, line },
29724
+ subject: symbol,
29725
+ details: `Public export \`${symbol}\` is missing a TSDoc summary.`,
29726
+ shortfall: "missing-summary",
29727
+ symbol,
29728
+ fixHint: "stub-tsdoc"
29729
+ });
29730
+ return findings;
29731
+ }
29732
+ if (record.hasThinSummary) {
29733
+ findings.push({
29734
+ category: AuditCategory.TsdocCoverage,
29735
+ severity: AuditSeverity.Advisory,
29736
+ location: { file, line },
29737
+ subject: symbol,
29738
+ details: `Public export \`${symbol}\` carries a thin TSDoc summary; consider expanding it.`,
29739
+ shortfall: "thin-summary",
29740
+ symbol
29741
+ });
29742
+ }
29743
+ if (!record.hasParams && isParamCarryingKind(record)) {
29744
+ findings.push({
29745
+ category: AuditCategory.TsdocCoverage,
29746
+ severity: AuditSeverity.Advisory,
29747
+ location: { file, line },
29748
+ subject: symbol,
29749
+ details: `Public export \`${symbol}\` has parameters with no \`@param\` block tag.`,
29750
+ shortfall: "missing-params",
29751
+ symbol
29752
+ });
29753
+ }
29754
+ if (!record.hasReturns && isReturnCarryingKind(record)) {
29755
+ findings.push({
29756
+ category: AuditCategory.TsdocCoverage,
29757
+ severity: AuditSeverity.Advisory,
29758
+ location: { file, line },
29759
+ subject: symbol,
29760
+ details: `Public export \`${symbol}\` has a return value with no \`@returns\` block tag.`,
29761
+ shortfall: "missing-returns",
29762
+ symbol
29763
+ });
29764
+ }
29765
+ return findings;
29766
+ }
29767
+ function createTsdocCoverageCheck(options) {
29768
+ const records = options.records;
29769
+ return {
29770
+ name: options.name ?? "tsdocCoverage",
29771
+ run(context) {
29772
+ const findings = [];
29773
+ for (const record of records) {
29774
+ for (const finding of tsdocRecordToFindings(record, context)) {
29775
+ findings.push(finding);
29776
+ }
29777
+ }
29778
+ return findings;
29779
+ }
29780
+ };
29781
+ }
29782
+ function isParamCarryingKind(record) {
29783
+ return record.kind === "Function";
29784
+ }
29785
+ function isReturnCarryingKind(record) {
29786
+ return record.kind === "Function";
29787
+ }
29788
+ function relativizeFile(file, repoRoot) {
29789
+ if (!file) {
29790
+ return "";
29791
+ }
29792
+ if (!path5.isAbsolute(file)) {
29793
+ return toPosix3(file);
29794
+ }
29795
+ const rel = path5.relative(repoRoot, file);
29796
+ return toPosix3(rel);
29797
+ }
29798
+ function toPosix3(p) {
29799
+ return p.split(path5.sep).join("/");
29800
+ }
29801
+
29951
29802
  // src/docs-sync/scan/run-scan.ts
29952
29803
  var fs3 = __toESM(require("fs"));
29953
- var path5 = __toESM(require("path"));
29804
+ var path6 = __toESM(require("path"));
29954
29805
  var DEFAULT_AUDIT_REPORT_DIR = ".claude/state/docs-sync";
29955
29806
  var SEVERITY_RANK = {
29956
29807
  blocking: 0,
@@ -29965,7 +29816,7 @@ var AUDIT_CATEGORY_ORDER = [
29965
29816
  AuditCategory.SampleFailures
29966
29817
  ];
29967
29818
  function runScan(options) {
29968
- const repoRoot = path5.resolve(options.repoRoot);
29819
+ const repoRoot = path6.resolve(options.repoRoot);
29969
29820
  const mode = options.mode;
29970
29821
  const scope = options.scope ?? "";
29971
29822
  const issueNumber = options.issueNumber;
@@ -30040,11 +29891,11 @@ function buildReport(args) {
30040
29891
  };
30041
29892
  }
30042
29893
  function persistAuditReport(args) {
30043
- const repoRoot = path5.resolve(args.repoRoot);
29894
+ const repoRoot = path6.resolve(args.repoRoot);
30044
29895
  const reportDir = args.reportDir ?? DEFAULT_AUDIT_REPORT_DIR;
30045
- const targetDir = path5.resolve(repoRoot, reportDir);
29896
+ const targetDir = path6.resolve(repoRoot, reportDir);
30046
29897
  fs3.mkdirSync(targetDir, { recursive: true });
30047
- const targetFile = path5.join(
29898
+ const targetFile = path6.join(
30048
29899
  targetDir,
30049
29900
  `${args.report.issueNumber}-audit.json`
30050
29901
  );
@@ -30107,7 +29958,7 @@ function compareFindings(a, b) {
30107
29958
  }
30108
29959
 
30109
29960
  // src/docs-sync/tsdoc-coverage/coverage.ts
30110
- var path6 = __toESM(require("path"));
29961
+ var path7 = __toESM(require("path"));
30111
29962
  var import_tsdoc = require("@microsoft/tsdoc");
30112
29963
  var ts2 = __toESM(require("typescript"));
30113
29964
  var TsDocCoverageKind = {
@@ -30125,8 +29976,8 @@ var DEFAULT_THIN_SUMMARY_WORD_THRESHOLD = 4;
30125
29976
  var DEFAULT_ENTRY_POINT = "src/index.ts";
30126
29977
  function analyzeTsDocCoverage(options) {
30127
29978
  const resolvedOptions = typeof options === "string" ? { packageRoot: options } : options;
30128
- const packageRoot = path6.resolve(resolvedOptions.packageRoot);
30129
- const entryPoint = path6.resolve(
29979
+ const packageRoot = path7.resolve(resolvedOptions.packageRoot);
29980
+ const entryPoint = path7.resolve(
30130
29981
  packageRoot,
30131
29982
  resolvedOptions.entryPoint ?? DEFAULT_ENTRY_POINT
30132
29983
  );
@@ -30189,7 +30040,7 @@ function analyzeTsDocCoverage(options) {
30189
30040
  }
30190
30041
  function resolveCompilerOptions(packageRoot, tsconfigPath) {
30191
30042
  if (tsconfigPath) {
30192
- const absoluteTsconfig = path6.resolve(packageRoot, tsconfigPath);
30043
+ const absoluteTsconfig = path7.resolve(packageRoot, tsconfigPath);
30193
30044
  const configFile = ts2.readConfigFile(absoluteTsconfig, ts2.sys.readFile);
30194
30045
  if (configFile.error) {
30195
30046
  throw new Error(
@@ -30199,7 +30050,7 @@ function resolveCompilerOptions(packageRoot, tsconfigPath) {
30199
30050
  const parsed = ts2.parseJsonConfigFileContent(
30200
30051
  configFile.config,
30201
30052
  ts2.sys,
30202
- path6.dirname(absoluteTsconfig)
30053
+ path7.dirname(absoluteTsconfig)
30203
30054
  );
30204
30055
  return { ...parsed.options, noEmit: true };
30205
30056
  }
@@ -30508,14 +30359,14 @@ var LAYOUT_ROOT_BY_PROJECT_TYPE = {
30508
30359
  };
30509
30360
  function validateMonorepoLayout(root) {
30510
30361
  const violations = [];
30511
- const rootOutdir = toPosix3(root.outdir);
30362
+ const rootOutdir = toPosix4(root.outdir);
30512
30363
  for (const sub of root.subprojects) {
30513
30364
  const className = sub.constructor.name;
30514
30365
  const expectedRoot = expectedRootFor(sub, className);
30515
30366
  if (expectedRoot === void 0) {
30516
30367
  continue;
30517
30368
  }
30518
- const relOutdir = relativeOutdir(rootOutdir, toPosix3(sub.outdir));
30369
+ const relOutdir = relativeOutdir(rootOutdir, toPosix4(sub.outdir));
30519
30370
  if (!outdirMatchesRoot(relOutdir, expectedRoot)) {
30520
30371
  violations.push({
30521
30372
  projectName: sub.name,
@@ -30574,7 +30425,7 @@ function outdirMatchesRoot(relOutdir, expectedRoot) {
30574
30425
  }
30575
30426
  return segments.length >= 2;
30576
30427
  }
30577
- function toPosix3(p) {
30428
+ function toPosix4(p) {
30578
30429
  return p.replace(/\\/g, "/");
30579
30430
  }
30580
30431
  function relativeOutdir(rootOutdir, subOutdir) {
@@ -30654,8 +30505,8 @@ var ResetTask = class _ResetTask extends import_projen14.Component {
30654
30505
  const resetTask = this.project.tasks.addTask(this.taskName, {
30655
30506
  description: "Delete build artifacts specified by pathsToRemove option, or artifactsDirectory if pathsToRemove is empty"
30656
30507
  });
30657
- this.pathsToRemove.forEach((path7) => {
30658
- resetTask.exec(`[ -e "${path7}" ] && rm -rf ${path7} || true`);
30508
+ this.pathsToRemove.forEach((path8) => {
30509
+ resetTask.exec(`[ -e "${path8}" ] && rm -rf ${path8} || true`);
30659
30510
  });
30660
30511
  const rootHasTurbo = TurboRepo.of(this.project.root) !== void 0;
30661
30512
  const isSubproject = this.project !== this.project.root;
@@ -30997,6 +30848,7 @@ var DEFAULT_TYPE_LABELS = [
30997
30848
  ];
30998
30849
  var DEFAULT_WORKFLOW_NAME2 = "sync-labels";
30999
30850
  var LABELS_CONFIG_PATH = ".github/labels.yml";
30851
+ var MAX_LABEL_DESCRIPTION_LENGTH = 100;
31000
30852
  function addSyncLabelsWorkflow(project, options) {
31001
30853
  const workflowName = options.workflowName ?? DEFAULT_WORKFLOW_NAME2;
31002
30854
  const deleteOtherLabels = options.deleteOtherLabels ?? true;
@@ -31019,6 +30871,18 @@ function addSyncLabelsWorkflow(project, options) {
31019
30871
  labelMap.set(label.name, label);
31020
30872
  }
31021
30873
  const allLabels = [...labelMap.values()];
30874
+ const overlength = allLabels.filter(
30875
+ (l) => (l.description ?? "").length > MAX_LABEL_DESCRIPTION_LENGTH
30876
+ );
30877
+ if (overlength.length > 0) {
30878
+ const offenders = overlength.map(
30879
+ (l) => ` - ${l.name} (${(l.description ?? "").length} chars): ${l.description}`
30880
+ ).join("\n");
30881
+ throw new Error(
30882
+ `The following label descriptions exceed GitHub's ${MAX_LABEL_DESCRIPTION_LENGTH}-char limit and would break the sync-labels workflow:
30883
+ ${offenders}`
30884
+ );
30885
+ }
31022
30886
  new LabelsFile(project, allLabels);
31023
30887
  const workflow = project.github?.addWorkflow(workflowName);
31024
30888
  if (!workflow) {
@@ -32660,16 +32524,11 @@ var TypeScriptConfig = class extends import_projen23.Component {
32660
32524
  DEFAULT_TYPE_LABELS,
32661
32525
  DEFAULT_UNBLOCK_COMMENT_TEMPLATE,
32662
32526
  DEFAULT_UNBLOCK_DEPENDENTS_ENABLED,
32663
- DEFAULT_WORKFLOW_DIAGRAMS_BUNDLE_PATH_PATTERNS,
32664
- DEFAULT_WORKFLOW_DIAGRAMS_EMIT_CHECKER,
32665
- DEFAULT_WORKFLOW_DIAGRAMS_EMIT_STARTER,
32666
- DEFAULT_WORKFLOW_DIAGRAMS_ENABLED,
32667
- DEFAULT_WORKFLOW_DIAGRAMS_PATH,
32668
- DEFAULT_WORKFLOW_DIAGRAMS_REQUIRE_UPDATE,
32669
32527
  DOCS_SYNC_AUDIT_SCHEMA_VERSION,
32670
32528
  JsiiFaker,
32671
32529
  LAYOUT_ENFORCEMENT,
32672
32530
  LAYOUT_ROOT_BY_PROJECT_TYPE,
32531
+ MAX_LABEL_DESCRIPTION_LENGTH,
32673
32532
  MCP_TRANSPORT,
32674
32533
  MERGE_METHODS,
32675
32534
  MIMIMUM_RELEASE_AGE,
@@ -32740,7 +32599,11 @@ var TypeScriptConfig = class extends import_projen23.Component {
32740
32599
  classifyRun,
32741
32600
  companyProfileBundle,
32742
32601
  compileFencedSamples,
32602
+ createApiDiffCheck,
32603
+ createReferenceMismatchCheck,
32604
+ createTsdocCoverageCheck,
32743
32605
  customerProfileBundle,
32606
+ diffApiRollups,
32744
32607
  docsSyncBundle,
32745
32608
  emptyCategoryBuckets,
32746
32609
  extractApiProcedure,
@@ -32755,11 +32618,13 @@ var TypeScriptConfig = class extends import_projen23.Component {
32755
32618
  maintenanceAuditBundle,
32756
32619
  meetingAnalysisBundle,
32757
32620
  orchestratorBundle,
32621
+ parseApiRollup,
32758
32622
  peopleProfileBundle,
32759
32623
  persistAuditReport,
32760
32624
  pnpmBundle,
32761
32625
  prReviewBundle,
32762
32626
  projenBundle,
32627
+ referenceRecordToFinding,
32763
32628
  regulatoryResearchBundle,
32764
32629
  renderAgentTierCaseStatement,
32765
32630
  renderAgentTierSection,
@@ -32796,10 +32661,6 @@ var TypeScriptConfig = class extends import_projen23.Component {
32796
32661
  renderSourceTierExamples,
32797
32662
  renderUnblockDependentsScript,
32798
32663
  renderUnblockDependentsSection,
32799
- renderWorkflowDiagramsBundleHook,
32800
- renderWorkflowDiagramsCheckerScript,
32801
- renderWorkflowDiagramsRuleContent,
32802
- renderWorkflowDiagramsStarterPage,
32803
32664
  requirementsAnalystBundle,
32804
32665
  requirementsReviewerBundle,
32805
32666
  requirementsWriterBundle,
@@ -32822,11 +32683,11 @@ var TypeScriptConfig = class extends import_projen23.Component {
32822
32683
  resolveTemplateVariables,
32823
32684
  resolveTypeScriptProjectOutdir,
32824
32685
  resolveUnblockDependents,
32825
- resolveWorkflowDiagrams,
32826
32686
  runScan,
32827
32687
  slackBundle,
32828
32688
  softwareProfileBundle,
32829
32689
  standardsResearchBundle,
32690
+ tsdocRecordToFindings,
32830
32691
  turborepoBundle,
32831
32692
  typescriptBundle,
32832
32693
  validateAgentTierConfig,
@@ -32841,7 +32702,6 @@ var TypeScriptConfig = class extends import_projen23.Component {
32841
32702
  validateSkillEvalsConfig,
32842
32703
  validateStarlightSingleton,
32843
32704
  validateUnblockDependentsConfig,
32844
- validateWorkflowDiagramsConfig,
32845
32705
  vitestBundle
32846
32706
  });
32847
32707
  //# sourceMappingURL=index.js.map