@webpresso/agent-kit 3.3.1 → 3.3.3

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.
Files changed (87) hide show
  1. package/catalog/AGENTS.md.tpl +3 -5
  2. package/catalog/agent/rules/pre-implementation.md +15 -8
  3. package/catalog/agent/skills/ultragoal/SKILL.md +5 -18
  4. package/catalog/agent/skills/verify/SKILL.md +12 -12
  5. package/catalog/compose/admin-blocks-registry.json +659 -0
  6. package/dist/esm/blueprint/core/parser.js +2 -4
  7. package/dist/esm/blueprint/core/validation/criteria.js +2 -1
  8. package/dist/esm/blueprint/core/validation/task-blocks.js +7 -1
  9. package/dist/esm/blueprint/lifecycle/review-provenance.js +85 -30
  10. package/dist/esm/blueprint/markdown/task-heading.d.ts +21 -0
  11. package/dist/esm/blueprint/markdown/task-heading.js +25 -0
  12. package/dist/esm/blueprint/trust/command-runner.d.ts +40 -0
  13. package/dist/esm/blueprint/trust/command-runner.js +265 -41
  14. package/dist/esm/build/cli-mcp-parity.js +6 -0
  15. package/dist/esm/build/package-manifest.js +7 -2
  16. package/dist/esm/ci/native-session-memory-cache.d.ts +2 -1
  17. package/dist/esm/ci/native-session-memory-cache.js +2 -1
  18. package/dist/esm/ci/release-progress.d.ts +37 -0
  19. package/dist/esm/ci/release-progress.js +139 -0
  20. package/dist/esm/cli/cli.d.ts +1 -1
  21. package/dist/esm/cli/cli.js +9 -0
  22. package/dist/esm/cli/commands/audit-core.js +9 -1
  23. package/dist/esm/cli/commands/audit.js +16 -5
  24. package/dist/esm/cli/commands/blueprint/mutations.js +2 -3
  25. package/dist/esm/cli/commands/init/mcp-spec.d.ts +18 -3
  26. package/dist/esm/cli/commands/init/mcp-spec.js +54 -6
  27. package/dist/esm/cli/commands/init/scaffold-agents-md.js +5 -7
  28. package/dist/esm/cli/commands/package-manager.js +8 -2
  29. package/dist/esm/cli/commands/release-progress.d.ts +53 -0
  30. package/dist/esm/cli/commands/release-progress.js +155 -0
  31. package/dist/esm/cli/commands/review.js +74 -11
  32. package/dist/esm/cli/utils.d.ts +8 -1
  33. package/dist/esm/cli/utils.js +12 -2
  34. package/dist/esm/compose/compose.d.ts +38 -0
  35. package/dist/esm/compose/compose.js +143 -0
  36. package/dist/esm/compose/escape-html.d.ts +5 -0
  37. package/dist/esm/compose/escape-html.js +12 -0
  38. package/dist/esm/compose/ops-report-render.d.ts +5 -0
  39. package/dist/esm/compose/ops-report-render.js +71 -0
  40. package/dist/esm/compose/ops-report-schema.d.ts +42 -0
  41. package/dist/esm/compose/ops-report-schema.js +46 -0
  42. package/dist/esm/compose/preview.d.ts +14 -0
  43. package/dist/esm/compose/preview.js +32 -0
  44. package/dist/esm/compose/registry-resolve.d.ts +47 -0
  45. package/dist/esm/compose/registry-resolve.js +133 -0
  46. package/dist/esm/git/changed-files.d.ts +20 -0
  47. package/dist/esm/git/changed-files.js +63 -0
  48. package/dist/esm/hooks/pretool-guard/validators/plan-frontmatter.js +3 -2
  49. package/dist/esm/hooks/stop/qa-changed-files.js +6 -1
  50. package/dist/esm/mcp/blueprint/handlers/document-mutations.js +2 -1
  51. package/dist/esm/mcp/blueprint/handlers/task-advance.js +2 -12
  52. package/dist/esm/mcp/blueprint/handlers/validate.js +6 -0
  53. package/dist/esm/mcp/tools/_names.d.ts +1 -1
  54. package/dist/esm/mcp/tools/_names.js +4 -0
  55. package/dist/esm/mcp/tools/_registry.js +8 -0
  56. package/dist/esm/mcp/tools/release-progress.d.ts +9 -0
  57. package/dist/esm/mcp/tools/release-progress.js +110 -0
  58. package/dist/esm/mcp/tools/wp-ui-blocks-list.d.ts +3 -0
  59. package/dist/esm/mcp/tools/wp-ui-blocks-list.js +43 -0
  60. package/dist/esm/mcp/tools/wp-ui-compose.d.ts +3 -0
  61. package/dist/esm/mcp/tools/wp-ui-compose.js +62 -0
  62. package/dist/esm/mcp/tools/wp-ui-preview.d.ts +3 -0
  63. package/dist/esm/mcp/tools/wp-ui-preview.js +52 -0
  64. package/dist/esm/package.json +2 -0
  65. package/dist/esm/review/delivery-verifier.d.ts +33 -2
  66. package/dist/esm/review/delivery-verifier.js +130 -24
  67. package/dist/esm/review/execution/review-checkout.d.ts +1 -0
  68. package/dist/esm/review/execution/review-checkout.js +386 -23
  69. package/dist/esm/review/execution/sandbox/adapter.d.ts +37 -0
  70. package/dist/esm/review/execution/sandbox/adapter.js +39 -0
  71. package/dist/esm/review/execution/sandbox/env.d.ts +12 -0
  72. package/dist/esm/review/execution/sandbox/env.js +37 -0
  73. package/dist/esm/review/execution/sandbox/index.d.ts +5 -0
  74. package/dist/esm/review/execution/sandbox/index.js +4 -0
  75. package/dist/esm/review/execution/sandbox/policy.d.ts +19 -0
  76. package/dist/esm/review/execution/sandbox/policy.js +95 -0
  77. package/dist/esm/review/execution/sandbox/probe.d.ts +20 -0
  78. package/dist/esm/review/execution/sandbox/probe.js +97 -0
  79. package/dist/esm/review/execution/sandbox/shell-quote.d.ts +14 -0
  80. package/dist/esm/review/execution/sandbox/shell-quote.js +18 -0
  81. package/dist/esm/review/execution/sandbox/tmpdir.d.ts +9 -0
  82. package/dist/esm/review/execution/sandbox/tmpdir.js +36 -0
  83. package/dist/esm/review/execution/sandbox/types.d.ts +31 -0
  84. package/dist/esm/review/execution/sandbox/types.js +6 -0
  85. package/dist/esm/review/execution/supervisor.js +44 -5
  86. package/dist/esm/review/execution/types.d.ts +2 -0
  87. package/package.json +24 -12
@@ -0,0 +1,659 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry.json",
3
+ "version": "1.0.0",
4
+ "minVersion": "1.0.0",
5
+ "blocks": [
6
+ {
7
+ "name": "header",
8
+ "view": "list",
9
+ "variants": ["minimal", "bold", "editorial"],
10
+ "props": [
11
+ {
12
+ "name": "title",
13
+ "type": "string",
14
+ "required": false,
15
+ "description": "Override list display name"
16
+ },
17
+ {
18
+ "name": "subtitle",
19
+ "type": "string",
20
+ "required": false,
21
+ "description": "Subtitle or description"
22
+ },
23
+ {
24
+ "name": "showCount",
25
+ "type": "boolean",
26
+ "required": false,
27
+ "default": true,
28
+ "description": "Show total item count"
29
+ }
30
+ ],
31
+ "slots": [
32
+ {
33
+ "name": "actions",
34
+ "description": "Action buttons in header",
35
+ "accepts": ["button", "dropdown"],
36
+ "multiple": true
37
+ }
38
+ ],
39
+ "permissions": [
40
+ {
41
+ "action": "create",
42
+ "requires": ["insert"],
43
+ "description": "Show create button in header"
44
+ },
45
+ {
46
+ "action": "export",
47
+ "requires": ["select"],
48
+ "description": "Show export action"
49
+ },
50
+ {
51
+ "action": "refresh",
52
+ "requires": ["select"],
53
+ "description": "Show refresh action"
54
+ }
55
+ ],
56
+ "description": "Displays list title, count, and optional actions"
57
+ },
58
+ {
59
+ "name": "toolbar",
60
+ "view": "list",
61
+ "variants": ["minimal", "bold"],
62
+ "props": [
63
+ {
64
+ "name": "position",
65
+ "type": "enum",
66
+ "required": false,
67
+ "default": "top",
68
+ "enumValues": ["top", "bottom"]
69
+ }
70
+ ],
71
+ "slots": [
72
+ {
73
+ "name": "actions",
74
+ "description": "Toolbar action buttons",
75
+ "accepts": ["button", "dropdown"],
76
+ "multiple": true
77
+ }
78
+ ],
79
+ "permissions": [
80
+ {
81
+ "action": "create",
82
+ "requires": ["insert"],
83
+ "description": "Show create button"
84
+ },
85
+ {
86
+ "action": "export",
87
+ "requires": ["select"],
88
+ "description": "Show export action"
89
+ },
90
+ {
91
+ "action": "import",
92
+ "requires": ["insert"],
93
+ "description": "Show import action"
94
+ },
95
+ {
96
+ "action": "refresh",
97
+ "requires": ["select"],
98
+ "description": "Show refresh action"
99
+ }
100
+ ],
101
+ "description": "Action toolbar with configurable position"
102
+ },
103
+ {
104
+ "name": "filter-bar",
105
+ "view": "list",
106
+ "props": [
107
+ {
108
+ "name": "collapsible",
109
+ "type": "boolean",
110
+ "required": false,
111
+ "default": false
112
+ },
113
+ {
114
+ "name": "defaultExpanded",
115
+ "type": "boolean",
116
+ "required": false,
117
+ "default": true
118
+ }
119
+ ],
120
+ "permissions": [
121
+ {
122
+ "action": "filter",
123
+ "requires": ["select"],
124
+ "description": "Show filter controls"
125
+ }
126
+ ],
127
+ "description": "Filter controls for list data"
128
+ },
129
+ {
130
+ "name": "filter-chips",
131
+ "view": "list",
132
+ "props": [
133
+ {
134
+ "name": "showClearAll",
135
+ "type": "boolean",
136
+ "required": false,
137
+ "default": true
138
+ }
139
+ ],
140
+ "description": "Displays active filters as removable chips"
141
+ },
142
+ {
143
+ "name": "bulk-actions",
144
+ "view": "list",
145
+ "props": [
146
+ {
147
+ "name": "position",
148
+ "type": "enum",
149
+ "required": false,
150
+ "default": "floating",
151
+ "enumValues": ["top", "floating", "bottom"]
152
+ }
153
+ ],
154
+ "slots": [
155
+ {
156
+ "name": "actions",
157
+ "description": "Bulk action buttons",
158
+ "accepts": ["button"],
159
+ "multiple": true
160
+ }
161
+ ],
162
+ "permissions": [
163
+ {
164
+ "action": "delete",
165
+ "requires": ["delete"],
166
+ "description": "Bulk delete action"
167
+ },
168
+ {
169
+ "action": "export",
170
+ "requires": ["select"],
171
+ "description": "Bulk export action"
172
+ },
173
+ {
174
+ "action": "archive",
175
+ "requires": ["update"],
176
+ "description": "Bulk archive action"
177
+ },
178
+ {
179
+ "action": "assign",
180
+ "requires": ["update"],
181
+ "description": "Bulk assign action"
182
+ }
183
+ ],
184
+ "description": "Actions for selected items"
185
+ },
186
+ {
187
+ "name": "table",
188
+ "view": "list",
189
+ "props": [
190
+ {
191
+ "name": "selectable",
192
+ "type": "boolean",
193
+ "required": false,
194
+ "default": false
195
+ },
196
+ {
197
+ "name": "stickyHeader",
198
+ "type": "boolean",
199
+ "required": false,
200
+ "default": false
201
+ },
202
+ {
203
+ "name": "density",
204
+ "type": "enum",
205
+ "required": false,
206
+ "default": "normal",
207
+ "enumValues": ["compact", "normal", "spacious"]
208
+ }
209
+ ],
210
+ "permissions": [
211
+ {
212
+ "action": "select",
213
+ "requires": ["select"],
214
+ "description": "View table data"
215
+ }
216
+ ],
217
+ "description": "Data table with sorting and selection"
218
+ },
219
+ {
220
+ "name": "pagination",
221
+ "view": "list",
222
+ "props": [
223
+ {
224
+ "name": "position",
225
+ "type": "enum",
226
+ "required": false,
227
+ "default": "bottom",
228
+ "enumValues": ["top", "bottom", "both"]
229
+ },
230
+ {
231
+ "name": "showTotal",
232
+ "type": "boolean",
233
+ "required": false,
234
+ "default": true
235
+ }
236
+ ],
237
+ "description": "Pagination controls"
238
+ },
239
+ {
240
+ "name": "empty-state",
241
+ "view": "list",
242
+ "props": [
243
+ {
244
+ "name": "title",
245
+ "type": "string",
246
+ "required": true,
247
+ "description": "Title shown when list is empty"
248
+ },
249
+ {
250
+ "name": "description",
251
+ "type": "string",
252
+ "required": false,
253
+ "description": "Additional description"
254
+ },
255
+ {
256
+ "name": "icon",
257
+ "type": "string",
258
+ "required": false,
259
+ "description": "Icon name"
260
+ }
261
+ ],
262
+ "slots": [
263
+ {
264
+ "name": "actions",
265
+ "description": "CTA buttons",
266
+ "accepts": ["button"],
267
+ "multiple": true
268
+ }
269
+ ],
270
+ "permissions": [
271
+ {
272
+ "action": "create",
273
+ "requires": ["insert"],
274
+ "description": "Show create action in empty state"
275
+ }
276
+ ],
277
+ "description": "Displayed when no items exist"
278
+ },
279
+ {
280
+ "name": "summary",
281
+ "view": "list",
282
+ "props": [
283
+ {
284
+ "name": "fields",
285
+ "type": "array",
286
+ "required": true,
287
+ "description": "Fields to display in summary"
288
+ },
289
+ {
290
+ "name": "layout",
291
+ "type": "enum",
292
+ "required": false,
293
+ "default": "horizontal",
294
+ "enumValues": ["horizontal", "vertical", "cards"]
295
+ }
296
+ ],
297
+ "description": "Aggregate metrics display"
298
+ },
299
+ {
300
+ "name": "header",
301
+ "view": "detail",
302
+ "variants": ["minimal", "bold", "editorial"],
303
+ "props": [
304
+ {
305
+ "name": "title",
306
+ "type": "string",
307
+ "required": false,
308
+ "description": "Override entity display name"
309
+ },
310
+ {
311
+ "name": "showBreadcrumb",
312
+ "type": "boolean",
313
+ "required": false,
314
+ "default": true
315
+ }
316
+ ],
317
+ "slots": [
318
+ {
319
+ "name": "actions",
320
+ "description": "Header action buttons",
321
+ "accepts": ["button", "dropdown"],
322
+ "multiple": true
323
+ }
324
+ ],
325
+ "permissions": [
326
+ {
327
+ "action": "edit",
328
+ "requires": ["update"],
329
+ "description": "Show edit button"
330
+ },
331
+ {
332
+ "action": "delete",
333
+ "requires": ["delete"],
334
+ "description": "Show delete button"
335
+ },
336
+ {
337
+ "action": "archive",
338
+ "requires": ["update"],
339
+ "description": "Show archive action"
340
+ },
341
+ {
342
+ "action": "duplicate",
343
+ "requires": ["insert"],
344
+ "description": "Show duplicate action"
345
+ }
346
+ ],
347
+ "description": "Entity header with title and actions"
348
+ },
349
+ {
350
+ "name": "summary",
351
+ "view": "detail",
352
+ "props": [
353
+ {
354
+ "name": "fields",
355
+ "type": "array",
356
+ "required": true,
357
+ "description": "Fields to display"
358
+ },
359
+ {
360
+ "name": "layout",
361
+ "type": "enum",
362
+ "required": false,
363
+ "default": "horizontal",
364
+ "enumValues": ["horizontal", "vertical", "cards"]
365
+ }
366
+ ],
367
+ "description": "Key metrics or status summary"
368
+ },
369
+ {
370
+ "name": "field-grid",
371
+ "view": "detail",
372
+ "props": [
373
+ {
374
+ "name": "title",
375
+ "type": "string",
376
+ "required": false
377
+ },
378
+ {
379
+ "name": "fields",
380
+ "type": "array",
381
+ "required": true,
382
+ "description": "Fields to display"
383
+ },
384
+ {
385
+ "name": "columns",
386
+ "type": "number",
387
+ "required": false,
388
+ "default": 2,
389
+ "description": "Grid columns (1-4)"
390
+ },
391
+ {
392
+ "name": "collapsible",
393
+ "type": "boolean",
394
+ "required": false,
395
+ "default": false
396
+ }
397
+ ],
398
+ "description": "Entity fields in grid layout"
399
+ },
400
+ {
401
+ "name": "related",
402
+ "view": "detail",
403
+ "props": [
404
+ {
405
+ "name": "relationship",
406
+ "type": "string",
407
+ "required": true,
408
+ "description": "Relationship name from entity"
409
+ },
410
+ {
411
+ "name": "title",
412
+ "type": "string",
413
+ "required": false
414
+ },
415
+ {
416
+ "name": "columns",
417
+ "type": "array",
418
+ "required": false,
419
+ "description": "Columns to show"
420
+ },
421
+ {
422
+ "name": "limit",
423
+ "type": "number",
424
+ "required": false,
425
+ "description": "Max items to show"
426
+ }
427
+ ],
428
+ "permissions": [
429
+ {
430
+ "action": "create",
431
+ "requires": ["insert"],
432
+ "description": "Add related items"
433
+ },
434
+ {
435
+ "action": "edit",
436
+ "requires": ["update"],
437
+ "description": "Edit related items"
438
+ },
439
+ {
440
+ "action": "delete",
441
+ "requires": ["delete"],
442
+ "description": "Remove related items"
443
+ },
444
+ {
445
+ "action": "view",
446
+ "requires": ["select"],
447
+ "description": "View related items"
448
+ }
449
+ ],
450
+ "description": "Related entity list"
451
+ },
452
+ {
453
+ "name": "timeline",
454
+ "view": "detail",
455
+ "props": [
456
+ {
457
+ "name": "title",
458
+ "type": "string",
459
+ "required": false,
460
+ "default": "Activity"
461
+ },
462
+ {
463
+ "name": "source",
464
+ "type": "enum",
465
+ "required": false,
466
+ "default": "audit_log",
467
+ "enumValues": ["audit_log", "comments", "custom"]
468
+ },
469
+ {
470
+ "name": "limit",
471
+ "type": "number",
472
+ "required": false,
473
+ "default": 10
474
+ }
475
+ ],
476
+ "description": "Activity history display"
477
+ },
478
+ {
479
+ "name": "info-panel",
480
+ "view": "detail",
481
+ "props": [
482
+ {
483
+ "name": "title",
484
+ "type": "string",
485
+ "required": false
486
+ },
487
+ {
488
+ "name": "fields",
489
+ "type": "array",
490
+ "required": true,
491
+ "description": "Fields to display"
492
+ },
493
+ {
494
+ "name": "position",
495
+ "type": "enum",
496
+ "required": false,
497
+ "default": "sidebar",
498
+ "enumValues": ["sidebar", "bottom"]
499
+ }
500
+ ],
501
+ "description": "Metadata/auxiliary information panel"
502
+ },
503
+ {
504
+ "name": "header",
505
+ "view": "form",
506
+ "props": [
507
+ {
508
+ "name": "title",
509
+ "type": "string",
510
+ "required": false,
511
+ "description": "Override form title"
512
+ },
513
+ {
514
+ "name": "showBreadcrumb",
515
+ "type": "boolean",
516
+ "required": false,
517
+ "default": true
518
+ },
519
+ {
520
+ "name": "showBackLink",
521
+ "type": "boolean",
522
+ "required": false,
523
+ "default": true
524
+ }
525
+ ],
526
+ "description": "Form header with navigation"
527
+ },
528
+ {
529
+ "name": "field-grid",
530
+ "view": "form",
531
+ "props": [
532
+ {
533
+ "name": "title",
534
+ "type": "string",
535
+ "required": false,
536
+ "description": "Section title"
537
+ },
538
+ {
539
+ "name": "fields",
540
+ "type": "array",
541
+ "required": true,
542
+ "description": "Field names to include"
543
+ },
544
+ {
545
+ "name": "columns",
546
+ "type": "number",
547
+ "required": false,
548
+ "default": 1,
549
+ "description": "Grid columns (1-4)"
550
+ },
551
+ {
552
+ "name": "collapsible",
553
+ "type": "boolean",
554
+ "required": false,
555
+ "default": false
556
+ },
557
+ {
558
+ "name": "collapsed",
559
+ "type": "boolean",
560
+ "required": false,
561
+ "default": false,
562
+ "description": "Initial collapsed state"
563
+ }
564
+ ],
565
+ "description": "Form fields in grid layout"
566
+ },
567
+ {
568
+ "name": "sidebar",
569
+ "view": "form",
570
+ "props": [
571
+ {
572
+ "name": "title",
573
+ "type": "string",
574
+ "required": false
575
+ },
576
+ {
577
+ "name": "content",
578
+ "type": "enum",
579
+ "required": false,
580
+ "default": "help",
581
+ "enumValues": ["help", "preview", "metadata", "custom"]
582
+ },
583
+ {
584
+ "name": "helpText",
585
+ "type": "string",
586
+ "required": false,
587
+ "description": "Help text content"
588
+ }
589
+ ],
590
+ "description": "Auxiliary content sidebar"
591
+ },
592
+ {
593
+ "name": "errors",
594
+ "view": "form",
595
+ "props": [
596
+ {
597
+ "name": "position",
598
+ "type": "enum",
599
+ "required": false,
600
+ "default": "top",
601
+ "enumValues": ["top", "inline", "bottom"]
602
+ },
603
+ {
604
+ "name": "showFieldErrors",
605
+ "type": "boolean",
606
+ "required": false,
607
+ "default": true
608
+ },
609
+ {
610
+ "name": "showSummary",
611
+ "type": "boolean",
612
+ "required": false,
613
+ "default": true
614
+ }
615
+ ],
616
+ "description": "Form validation errors display"
617
+ },
618
+ {
619
+ "name": "actions",
620
+ "view": "form",
621
+ "props": [
622
+ {
623
+ "name": "position",
624
+ "type": "enum",
625
+ "required": false,
626
+ "default": "bottom",
627
+ "enumValues": ["top", "bottom", "sticky"]
628
+ },
629
+ {
630
+ "name": "alignment",
631
+ "type": "enum",
632
+ "required": false,
633
+ "default": "right",
634
+ "enumValues": ["left", "center", "right", "space-between"]
635
+ },
636
+ {
637
+ "name": "showCancel",
638
+ "type": "boolean",
639
+ "required": false,
640
+ "default": true
641
+ },
642
+ {
643
+ "name": "showReset",
644
+ "type": "boolean",
645
+ "required": false,
646
+ "default": false
647
+ }
648
+ ],
649
+ "permissions": [
650
+ {
651
+ "action": "submit",
652
+ "requires": ["insert", "update"],
653
+ "description": "Submit form"
654
+ }
655
+ ],
656
+ "description": "Form submit/cancel buttons"
657
+ }
658
+ ]
659
+ }
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import matter from "gray-matter";
8
8
  import { planFrontmatterSchema, taskStatusSchema } from "#core/schema";
9
- import { buildTaskHeadingRegex } from "#markdown/task-heading";
9
+ import { buildTaskHeadingRegex, isTaskHeaderLine } from "#markdown/task-heading";
10
10
  function parseWithSchema(markdown, schema) {
11
11
  const { data: rawData, content } = matter(markdown);
12
12
  const data = schema.parse(rawData);
@@ -337,9 +337,7 @@ function extractBlocked(section) {
337
337
  }
338
338
  return blockedText;
339
339
  }
340
- function isTaskHeader(line) {
341
- return /^####\s+(?:\[[^\]]+\]\s+)?Task\s+\d+(?:\.\d+)+:/.test(line);
342
- }
340
+ const isTaskHeader = isTaskHeaderLine;
343
341
  function isMetadataLine(line) {
344
342
  return /^\*\*(Depends|Blocked|Status):\*\*/i.test(line);
345
343
  }
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Check acceptance criteria completion in plan markdown.
3
3
  */
4
+ import { buildTaskHeadingRegex } from "#markdown/task-heading";
4
5
  const CHECKBOX_REGEX = /^- \[([ x])\]/gm;
5
- const TASK_HEADER_REGEX = /^####\s+(?:\[[^\]]+\]\s+)?Task\s+\d+(?:\.\d+)+:.*$/gm;
6
+ const TASK_HEADER_REGEX = buildTaskHeadingRegex("gm");
6
7
  const TASK_DONE_OR_DROPPED_REGEX = /^\*\*Status:\*\*\s*(done|dropped)\s*$/im;
7
8
  const SECTION_BOUNDARY_REGEX = /\n##\s|\n---\n/;
8
9
  export function checkAcceptanceCriteria(markdown) {
@@ -1,6 +1,12 @@
1
1
  import { z } from "zod";
2
2
  import { executionBackendSchema } from "#types/execution-backend";
3
- const TASK_HEADING_REGEX = /^####\s+Task\s+(\d+\.\d+):/;
3
+ import { buildTaskHeadingRegex } from "#markdown/task-heading";
4
+ /**
5
+ * Non-global on purpose: this regex is tested line-by-line via `.exec`, and a
6
+ * shared `g`-flagged instance would carry `lastIndex` between lines and skip
7
+ * alternating headings.
8
+ */
9
+ const TASK_HEADING_REGEX = buildTaskHeadingRegex("m");
4
10
  /**
5
11
  * Zod schema for optional TASK-level frontmatter fields.
6
12
  *