@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.d.mts +251 -319
- package/lib/index.d.ts +252 -320
- package/lib/index.js +454 -594
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +448 -584
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
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:
|
|
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,
|
|
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
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
27264
|
-
const parts =
|
|
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
|
|
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 =
|
|
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 =
|
|
29894
|
+
const repoRoot = path6.resolve(args.repoRoot);
|
|
30044
29895
|
const reportDir = args.reportDir ?? DEFAULT_AUDIT_REPORT_DIR;
|
|
30045
|
-
const targetDir =
|
|
29896
|
+
const targetDir = path6.resolve(repoRoot, reportDir);
|
|
30046
29897
|
fs3.mkdirSync(targetDir, { recursive: true });
|
|
30047
|
-
const targetFile =
|
|
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
|
|
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 =
|
|
30129
|
-
const entryPoint =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
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
|
|
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((
|
|
30658
|
-
resetTask.exec(`[ -e "${
|
|
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
|