@patwoodman/dsh-sdlc-flow 0.4.0-beta.17 → 0.4.0-beta.20

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 (37) hide show
  1. package/cordis.patch.yml +98 -36
  2. package/lib/rows/cli/locale/en.json +6 -0
  3. package/lib/rows/cli/locale/zh.json +6 -0
  4. package/lib/rows/cli/package.json +1 -1
  5. package/lib/rows/core/cordis.patch.yml +51 -0
  6. package/lib/rows/core/icon.svg +28 -0
  7. package/lib/rows/core/locale/en.json +6 -0
  8. package/lib/rows/core/locale/zh.json +6 -0
  9. package/lib/rows/core/package.json +1 -1
  10. package/lib/rows/guard/cordis.patch.yml +23 -0
  11. package/lib/rows/guard/icon.svg +28 -0
  12. package/lib/rows/guard/locale/en.json +6 -0
  13. package/lib/rows/guard/locale/zh.json +6 -0
  14. package/lib/rows/guard/package.json +1 -1
  15. package/lib/rows/guard/schema/path-policy.schema.json +48 -0
  16. package/lib/rows/presets/cordis.patch.yml +634 -0
  17. package/lib/rows/presets/icon.svg +28 -0
  18. package/lib/rows/presets/lib/roles.js +45 -15
  19. package/lib/rows/presets/locale/en.json +6 -0
  20. package/lib/rows/presets/locale/zh.json +6 -0
  21. package/lib/rows/presets/package.json +1 -1
  22. package/lib/rows/tools/cordis.patch.yml +11 -0
  23. package/lib/rows/tools/icon.svg +28 -0
  24. package/lib/rows/tools/lib/dispatch.js +11 -0
  25. package/lib/rows/tools/lib/index.js +12 -1
  26. package/lib/rows/tools/lib/plan.js +11 -0
  27. package/lib/rows/tools/lib/plugin.js +26 -1
  28. package/lib/rows/tools/lib/report.js +15 -0
  29. package/lib/rows/tools/locale/en.json +6 -0
  30. package/lib/rows/tools/locale/zh.json +6 -0
  31. package/lib/rows/tools/package.json +1 -1
  32. package/lib/rows/ui/cordis.patch.yml +11 -0
  33. package/lib/rows/ui/icon.svg +28 -0
  34. package/lib/rows/ui/locale/en.json +6 -0
  35. package/lib/rows/ui/locale/zh.json +6 -0
  36. package/lib/rows/ui/package.json +1 -1
  37. package/package.json +4 -1
package/cordis.patch.yml CHANGED
@@ -22,10 +22,11 @@
22
22
  #
23
23
  # Order matters only where a row waits on a service: services first, then the
24
24
  # tools and preset rows that use them, then the UI. The
25
- # `agent-preset-registry` row stays FIRST inside the presets block (the dialect
26
- # has no insert-if-missing), so on the web template the composed lead holds two
27
- # same-id registry rows at one service — the loader accepts both and every
28
- # preset activates (verified live); M0-02 pins those counts.
25
+ # `agent-preset-registry` row stays FIRST inside the presets member block
26
+ # (headless/sdk, the dialect has no insert-if-missing). This generated lead
27
+ # patch replaces that insert with an id-targeted override of the web template's
28
+ # shipped row: a duplicate id+name is loader-accepted but blocks plugin-manager
29
+ # uninstall. M0-02 pins one registry row whose default is sdlc-lead.
29
30
 
30
31
  # ── the meta-bundle's own row ────────────────────────────────────────────────
31
32
  # A row that executes this package's apply() at boot, so the meta-bundle is a
@@ -82,11 +83,16 @@
82
83
  worktreePath: !!js process.cwd()
83
84
 
84
85
  # ── from @patwoodman/dsh-sdlc-flow-presets — the 26 role presets (C.3)
86
+ # The web template ships agent-preset-registry. Override its default instead
87
+ # of inserting a duplicate row: a duplicate id+name is loader-accepted but
88
+ # blocks plugin-manager uninstall as "bundle-in-use". The presets member keeps
89
+ # the insert for headless/sdk templates, which have no registry row.
90
+ - id: agent-preset-registry
91
+ name: '@deepseek-ai/dsh-agent-preset-registry'
92
+ config:
93
+ default: sdlc-lead
94
+
85
95
  - insert:
86
- - id: agent-preset-registry
87
- name: "@deepseek-ai/dsh-agent-preset-registry"
88
- config:
89
- default: sdlc-lead
90
96
  - id: preset-sdlc-lead
91
97
  name: "@deepseek-ai/dsh-agent-preset"
92
98
  config:
@@ -106,14 +112,20 @@
106
112
  name: "@deepseek-ai/dsh-tool-fs"
107
113
  - id: tool-todo
108
114
  name: "@deepseek-ai/dsh-tool-todo"
115
+ config:
116
+ allowParallelInProgress: true
109
117
  - id: sdlc-report
110
- name: "@patwoodman/dsh-sdlc-flow/tools"
118
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
111
119
  - id: tool-subagent
112
120
  name: "@deepseek-ai/dsh-tool-subagent"
121
+ config:
122
+ provider: spawn
123
+ toolName: subagent
124
+ backgroundMode: continuable
113
125
  - id: sdlc-dispatch
114
- name: "@patwoodman/dsh-sdlc-flow/tools"
126
+ name: "@patwoodman/dsh-sdlc-flow/tools-dispatch"
115
127
  - id: sdlc-plan
116
- name: "@patwoodman/dsh-sdlc-flow/tools"
128
+ name: "@patwoodman/dsh-sdlc-flow/tools-plan"
117
129
  - id: preset-sdlc-business-analyst
118
130
  name: "@deepseek-ai/dsh-agent-preset"
119
131
  config:
@@ -133,8 +145,10 @@
133
145
  name: "@deepseek-ai/dsh-tool-fs"
134
146
  - id: tool-todo
135
147
  name: "@deepseek-ai/dsh-tool-todo"
148
+ config:
149
+ allowParallelInProgress: false
136
150
  - id: sdlc-report
137
- name: "@patwoodman/dsh-sdlc-flow/tools"
151
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
138
152
  - id: preset-sdlc-requirements-engineer
139
153
  name: "@deepseek-ai/dsh-agent-preset"
140
154
  config:
@@ -154,8 +168,10 @@
154
168
  name: "@deepseek-ai/dsh-tool-fs"
155
169
  - id: tool-todo
156
170
  name: "@deepseek-ai/dsh-tool-todo"
171
+ config:
172
+ allowParallelInProgress: false
157
173
  - id: sdlc-report
158
- name: "@patwoodman/dsh-sdlc-flow/tools"
174
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
159
175
  - id: preset-sdlc-product-owner
160
176
  name: "@deepseek-ai/dsh-agent-preset"
161
177
  config:
@@ -175,8 +191,10 @@
175
191
  name: "@deepseek-ai/dsh-tool-fs"
176
192
  - id: tool-todo
177
193
  name: "@deepseek-ai/dsh-tool-todo"
194
+ config:
195
+ allowParallelInProgress: false
178
196
  - id: sdlc-report
179
- name: "@patwoodman/dsh-sdlc-flow/tools"
197
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
180
198
  - id: preset-sdlc-solution-architect
181
199
  name: "@deepseek-ai/dsh-agent-preset"
182
200
  config:
@@ -196,8 +214,10 @@
196
214
  name: "@deepseek-ai/dsh-tool-fs"
197
215
  - id: tool-todo
198
216
  name: "@deepseek-ai/dsh-tool-todo"
217
+ config:
218
+ allowParallelInProgress: false
199
219
  - id: sdlc-report
200
- name: "@patwoodman/dsh-sdlc-flow/tools"
220
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
201
221
  - id: preset-sdlc-security-engineer
202
222
  name: "@deepseek-ai/dsh-agent-preset"
203
223
  config:
@@ -217,8 +237,10 @@
217
237
  name: "@deepseek-ai/dsh-tool-fs"
218
238
  - id: tool-todo
219
239
  name: "@deepseek-ai/dsh-tool-todo"
240
+ config:
241
+ allowParallelInProgress: false
220
242
  - id: sdlc-report
221
- name: "@patwoodman/dsh-sdlc-flow/tools"
243
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
222
244
  - id: preset-sdlc-data-engineer
223
245
  name: "@deepseek-ai/dsh-agent-preset"
224
246
  config:
@@ -238,8 +260,10 @@
238
260
  name: "@deepseek-ai/dsh-tool-fs"
239
261
  - id: tool-todo
240
262
  name: "@deepseek-ai/dsh-tool-todo"
263
+ config:
264
+ allowParallelInProgress: false
241
265
  - id: sdlc-report
242
- name: "@patwoodman/dsh-sdlc-flow/tools"
266
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
243
267
  - id: preset-sdlc-database-engineer
244
268
  name: "@deepseek-ai/dsh-agent-preset"
245
269
  config:
@@ -259,8 +283,10 @@
259
283
  name: "@deepseek-ai/dsh-tool-fs"
260
284
  - id: tool-todo
261
285
  name: "@deepseek-ai/dsh-tool-todo"
286
+ config:
287
+ allowParallelInProgress: false
262
288
  - id: sdlc-report
263
- name: "@patwoodman/dsh-sdlc-flow/tools"
289
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
264
290
  - id: preset-sdlc-ux-designer
265
291
  name: "@deepseek-ai/dsh-agent-preset"
266
292
  config:
@@ -280,8 +306,10 @@
280
306
  name: "@deepseek-ai/dsh-tool-fs"
281
307
  - id: tool-todo
282
308
  name: "@deepseek-ai/dsh-tool-todo"
309
+ config:
310
+ allowParallelInProgress: false
283
311
  - id: sdlc-report
284
- name: "@patwoodman/dsh-sdlc-flow/tools"
312
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
285
313
  - id: preset-sdlc-ui-designer
286
314
  name: "@deepseek-ai/dsh-agent-preset"
287
315
  config:
@@ -301,8 +329,10 @@
301
329
  name: "@deepseek-ai/dsh-tool-fs"
302
330
  - id: tool-todo
303
331
  name: "@deepseek-ai/dsh-tool-todo"
332
+ config:
333
+ allowParallelInProgress: false
304
334
  - id: sdlc-report
305
- name: "@patwoodman/dsh-sdlc-flow/tools"
335
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
306
336
  - id: preset-sdlc-accessibility-engineer
307
337
  name: "@deepseek-ai/dsh-agent-preset"
308
338
  config:
@@ -322,8 +352,10 @@
322
352
  name: "@deepseek-ai/dsh-tool-fs"
323
353
  - id: tool-todo
324
354
  name: "@deepseek-ai/dsh-tool-todo"
355
+ config:
356
+ allowParallelInProgress: false
325
357
  - id: sdlc-report
326
- name: "@patwoodman/dsh-sdlc-flow/tools"
358
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
327
359
  - id: preset-sdlc-frontend-engineer
328
360
  name: "@deepseek-ai/dsh-agent-preset"
329
361
  config:
@@ -343,8 +375,10 @@
343
375
  name: "@deepseek-ai/dsh-tool-fs"
344
376
  - id: tool-todo
345
377
  name: "@deepseek-ai/dsh-tool-todo"
378
+ config:
379
+ allowParallelInProgress: false
346
380
  - id: sdlc-report
347
- name: "@patwoodman/dsh-sdlc-flow/tools"
381
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
348
382
  - id: preset-sdlc-backend-engineer
349
383
  name: "@deepseek-ai/dsh-agent-preset"
350
384
  config:
@@ -364,8 +398,10 @@
364
398
  name: "@deepseek-ai/dsh-tool-fs"
365
399
  - id: tool-todo
366
400
  name: "@deepseek-ai/dsh-tool-todo"
401
+ config:
402
+ allowParallelInProgress: false
367
403
  - id: sdlc-report
368
- name: "@patwoodman/dsh-sdlc-flow/tools"
404
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
369
405
  - id: preset-sdlc-api-engineer
370
406
  name: "@deepseek-ai/dsh-agent-preset"
371
407
  config:
@@ -385,8 +421,10 @@
385
421
  name: "@deepseek-ai/dsh-tool-fs"
386
422
  - id: tool-todo
387
423
  name: "@deepseek-ai/dsh-tool-todo"
424
+ config:
425
+ allowParallelInProgress: false
388
426
  - id: sdlc-report
389
- name: "@patwoodman/dsh-sdlc-flow/tools"
427
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
390
428
  - id: preset-sdlc-integration-engineer
391
429
  name: "@deepseek-ai/dsh-agent-preset"
392
430
  config:
@@ -406,8 +444,10 @@
406
444
  name: "@deepseek-ai/dsh-tool-fs"
407
445
  - id: tool-todo
408
446
  name: "@deepseek-ai/dsh-tool-todo"
447
+ config:
448
+ allowParallelInProgress: false
409
449
  - id: sdlc-report
410
- name: "@patwoodman/dsh-sdlc-flow/tools"
450
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
411
451
  - id: preset-sdlc-devops-engineer
412
452
  name: "@deepseek-ai/dsh-agent-preset"
413
453
  config:
@@ -427,8 +467,10 @@
427
467
  name: "@deepseek-ai/dsh-tool-fs"
428
468
  - id: tool-todo
429
469
  name: "@deepseek-ai/dsh-tool-todo"
470
+ config:
471
+ allowParallelInProgress: false
430
472
  - id: sdlc-report
431
- name: "@patwoodman/dsh-sdlc-flow/tools"
473
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
432
474
  - id: preset-sdlc-platform-engineer
433
475
  name: "@deepseek-ai/dsh-agent-preset"
434
476
  config:
@@ -448,8 +490,10 @@
448
490
  name: "@deepseek-ai/dsh-tool-fs"
449
491
  - id: tool-todo
450
492
  name: "@deepseek-ai/dsh-tool-todo"
493
+ config:
494
+ allowParallelInProgress: false
451
495
  - id: sdlc-report
452
- name: "@patwoodman/dsh-sdlc-flow/tools"
496
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
453
497
  - id: preset-sdlc-qa-engineer
454
498
  name: "@deepseek-ai/dsh-agent-preset"
455
499
  config:
@@ -469,8 +513,10 @@
469
513
  name: "@deepseek-ai/dsh-tool-fs"
470
514
  - id: tool-todo
471
515
  name: "@deepseek-ai/dsh-tool-todo"
516
+ config:
517
+ allowParallelInProgress: false
472
518
  - id: sdlc-report
473
- name: "@patwoodman/dsh-sdlc-flow/tools"
519
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
474
520
  - id: preset-sdlc-test-automation-engineer
475
521
  name: "@deepseek-ai/dsh-agent-preset"
476
522
  config:
@@ -490,8 +536,10 @@
490
536
  name: "@deepseek-ai/dsh-tool-fs"
491
537
  - id: tool-todo
492
538
  name: "@deepseek-ai/dsh-tool-todo"
539
+ config:
540
+ allowParallelInProgress: false
493
541
  - id: sdlc-report
494
- name: "@patwoodman/dsh-sdlc-flow/tools"
542
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
495
543
  - id: preset-sdlc-e2e-engineer
496
544
  name: "@deepseek-ai/dsh-agent-preset"
497
545
  config:
@@ -511,8 +559,10 @@
511
559
  name: "@deepseek-ai/dsh-tool-fs"
512
560
  - id: tool-todo
513
561
  name: "@deepseek-ai/dsh-tool-todo"
562
+ config:
563
+ allowParallelInProgress: false
514
564
  - id: sdlc-report
515
- name: "@patwoodman/dsh-sdlc-flow/tools"
565
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
516
566
  - id: preset-sdlc-visual-qa-engineer
517
567
  name: "@deepseek-ai/dsh-agent-preset"
518
568
  config:
@@ -532,8 +582,10 @@
532
582
  name: "@deepseek-ai/dsh-tool-fs"
533
583
  - id: tool-todo
534
584
  name: "@deepseek-ai/dsh-tool-todo"
585
+ config:
586
+ allowParallelInProgress: false
535
587
  - id: sdlc-report
536
- name: "@patwoodman/dsh-sdlc-flow/tools"
588
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
537
589
  - id: preset-sdlc-performance-engineer
538
590
  name: "@deepseek-ai/dsh-agent-preset"
539
591
  config:
@@ -553,8 +605,10 @@
553
605
  name: "@deepseek-ai/dsh-tool-fs"
554
606
  - id: tool-todo
555
607
  name: "@deepseek-ai/dsh-tool-todo"
608
+ config:
609
+ allowParallelInProgress: false
556
610
  - id: sdlc-report
557
- name: "@patwoodman/dsh-sdlc-flow/tools"
611
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
558
612
  - id: preset-sdlc-technical-writer
559
613
  name: "@deepseek-ai/dsh-agent-preset"
560
614
  config:
@@ -574,8 +628,10 @@
574
628
  name: "@deepseek-ai/dsh-tool-fs"
575
629
  - id: tool-todo
576
630
  name: "@deepseek-ai/dsh-tool-todo"
631
+ config:
632
+ allowParallelInProgress: false
577
633
  - id: sdlc-report
578
- name: "@patwoodman/dsh-sdlc-flow/tools"
634
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
579
635
  - id: preset-sdlc-release-manager
580
636
  name: "@deepseek-ai/dsh-agent-preset"
581
637
  config:
@@ -595,8 +651,10 @@
595
651
  name: "@deepseek-ai/dsh-tool-fs"
596
652
  - id: tool-todo
597
653
  name: "@deepseek-ai/dsh-tool-todo"
654
+ config:
655
+ allowParallelInProgress: false
598
656
  - id: sdlc-report
599
- name: "@patwoodman/dsh-sdlc-flow/tools"
657
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
600
658
  - id: preset-sdlc-code-reviewer
601
659
  name: "@deepseek-ai/dsh-agent-preset"
602
660
  config:
@@ -616,8 +674,10 @@
616
674
  name: "@deepseek-ai/dsh-tool-fs"
617
675
  - id: tool-todo
618
676
  name: "@deepseek-ai/dsh-tool-todo"
677
+ config:
678
+ allowParallelInProgress: false
619
679
  - id: sdlc-report
620
- name: "@patwoodman/dsh-sdlc-flow/tools"
680
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
621
681
  - id: preset-sdlc-sre-engineer
622
682
  name: "@deepseek-ai/dsh-agent-preset"
623
683
  config:
@@ -637,8 +697,10 @@
637
697
  name: "@deepseek-ai/dsh-tool-fs"
638
698
  - id: tool-todo
639
699
  name: "@deepseek-ai/dsh-tool-todo"
700
+ config:
701
+ allowParallelInProgress: false
640
702
  - id: sdlc-report
641
- name: "@patwoodman/dsh-sdlc-flow/tools"
703
+ name: "@patwoodman/dsh-sdlc-flow/tools-report"
642
704
  - id: sdlc-presets
643
705
  name: "@patwoodman/dsh-sdlc-flow/presets-plugin"
644
706
  config: {}
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "SDLC CLI",
4
+ "description": "Deterministic sdlc control plane: init, status, tasks, debug compare."
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "SDLC CLI",
4
+ "description": "Deterministic sdlc control plane: init, status, tasks, debug compare."
5
+ }
6
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@patwoodman/dsh-sdlc-flow-cli",
3
- "version": "0.4.0-beta.17",
3
+ "version": "0.4.0-beta.20",
4
4
  "type": "module"
5
5
  }
@@ -0,0 +1,51 @@
1
+ # sdlc-core — host services (spec v3 C.1/C.2).
2
+ #
3
+ # HOST BUNDLE. This package declares the runtime authority: task engine, state
4
+ # transitions, scheduler, router, verifier, integration manager, evidence,
5
+ # escalation and worker dispatch. It must NEVER be installed into a worker
6
+ # profile — mounting it there would start a second scheduler and a second
7
+ # writer against sdlc.db (errata E6). install-local.mjs and doctor.mjs assert
8
+ # the partition.
9
+ #
10
+ # NOTE (discrepancy D2): spec C.1's inline comment shows sdlc-core declaring
11
+ # both cordis.patch.yml and presets.patch.yml. The 26 preset rows live in
12
+ # @patwoodman/dsh-sdlc-flow-presets (C.1 body text); declaring them here as well would
13
+ # produce duplicate loader row ids and fail M0-02-no-dup-ids. Core therefore
14
+ # declares host rows only.
15
+ - insert:
16
+ - id: sdlc-tasks
17
+ name: '@patwoodman/dsh-sdlc-flow-core/services'
18
+ config:
19
+ service: tasks
20
+ - id: sdlc-scheduler
21
+ name: '@patwoodman/dsh-sdlc-flow-core/services'
22
+ config:
23
+ service: scheduler
24
+ - id: sdlc-router
25
+ name: '@patwoodman/dsh-sdlc-flow-core/services'
26
+ config:
27
+ service: router
28
+ - id: sdlc-verifier
29
+ name: '@patwoodman/dsh-sdlc-flow-core/services'
30
+ config:
31
+ service: verifier
32
+ - id: sdlc-integration
33
+ name: '@patwoodman/dsh-sdlc-flow-core/services'
34
+ config:
35
+ service: integration
36
+ - id: sdlc-evidence
37
+ name: '@patwoodman/dsh-sdlc-flow-core/services'
38
+ config:
39
+ service: evidence
40
+ - id: sdlc-escalation
41
+ name: '@patwoodman/dsh-sdlc-flow-core/services'
42
+ config:
43
+ service: escalation
44
+ - id: sdlc-worker-mgr
45
+ name: '@patwoodman/dsh-sdlc-flow-core/services'
46
+ config:
47
+ service: worker-mgr
48
+ - id: sdlc-recovery
49
+ name: '@patwoodman/dsh-sdlc-flow-core/services'
50
+ config:
51
+ service: recovery
@@ -0,0 +1,28 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="Universal SDLC Orchestrator">
2
+ <defs>
3
+ <linearGradient id="sdlc-bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#1e3a8a"/>
5
+ <stop offset="1" stop-color="#0e7490"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="64" height="64" rx="14" fill="url(#sdlc-bg)"/>
9
+ <g fill="none" stroke="#e0f2fe" stroke-width="2.4" stroke-linecap="round">
10
+ <path d="M32 17v9"/>
11
+ <path d="M32 34v4"/>
12
+ <path d="M24 44l-8 6"/>
13
+ <path d="M40 44l8 6"/>
14
+ </g>
15
+ <g fill="#e0f2fe">
16
+ <circle cx="32" cy="13" r="4.6"/>
17
+ <circle cx="32" cy="29" r="4.6"/>
18
+ <circle cx="19" cy="47" r="4.6"/>
19
+ <circle cx="45" cy="47" r="4.6"/>
20
+ </g>
21
+ <g fill="#0e7490">
22
+ <circle cx="32" cy="13" r="1.7"/>
23
+ <circle cx="32" cy="29" r="1.7"/>
24
+ <circle cx="19" cy="47" r="1.7"/>
25
+ <circle cx="45" cy="47" r="1.7"/>
26
+ </g>
27
+ <path d="M27.5 39.5l4.5 4.5 4.5-4.5" fill="none" stroke="#67e8f9" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/>
28
+ </svg>
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "DSH SDLC Flow",
4
+ "description": "Task engine, scheduler, router, verifier, and integration manager. The runtime authority — lead profile only."
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "DSH SDLC Flow",
4
+ "description": "Task engine, scheduler, router, verifier, and integration manager. The runtime authority — lead profile only."
5
+ }
6
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@patwoodman/dsh-sdlc-flow-core",
3
- "version": "0.4.0-beta.17",
3
+ "version": "0.4.0-beta.20",
4
4
  "type": "module"
5
5
  }
@@ -0,0 +1,23 @@
1
+ # sdlc-guard — worker-side enforcement (spec v3 C.1/C.7).
2
+ #
3
+ # Installed into the sdlc-worker profile beside sdlc-tools, and into the lead
4
+ # profile for symmetry. It registers the `tools/pre-execute` waterfall and the
5
+ # fs write decider. There is no host service here and no DB access: the guard is
6
+ # policy, the sandbox root and the post-hoc git diff are the real controls.
7
+ - insert:
8
+ - id: sdlc-guard
9
+ name: '@patwoodman/dsh-sdlc-flow-guard/plugin'
10
+ config:
11
+ guardMode: deny
12
+ orchestratorPaths: ['.sdlc/**', '.dsh/**']
13
+ protectedOrchestratorPaths:
14
+ - '.sdlc/sdlc.db'
15
+ - '.sdlc/sdlc.db-*'
16
+ - '.sdlc/sdlc.lock'
17
+ - '.sdlc/instance.lock'
18
+ - '.sdlc/task-contract.json'
19
+ guardForbiddenPatterns:
20
+ - 'git push --force*'
21
+ - 'rm -rf /'
22
+ - 'git clean -fdx*'
23
+ - 'git reset --hard*'
@@ -0,0 +1,28 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="Universal SDLC Orchestrator">
2
+ <defs>
3
+ <linearGradient id="sdlc-bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#1e3a8a"/>
5
+ <stop offset="1" stop-color="#0e7490"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="64" height="64" rx="14" fill="url(#sdlc-bg)"/>
9
+ <g fill="none" stroke="#e0f2fe" stroke-width="2.4" stroke-linecap="round">
10
+ <path d="M32 17v9"/>
11
+ <path d="M32 34v4"/>
12
+ <path d="M24 44l-8 6"/>
13
+ <path d="M40 44l8 6"/>
14
+ </g>
15
+ <g fill="#e0f2fe">
16
+ <circle cx="32" cy="13" r="4.6"/>
17
+ <circle cx="32" cy="29" r="4.6"/>
18
+ <circle cx="19" cy="47" r="4.6"/>
19
+ <circle cx="45" cy="47" r="4.6"/>
20
+ </g>
21
+ <g fill="#0e7490">
22
+ <circle cx="32" cy="13" r="1.7"/>
23
+ <circle cx="32" cy="29" r="1.7"/>
24
+ <circle cx="19" cy="47" r="1.7"/>
25
+ <circle cx="45" cy="47" r="1.7"/>
26
+ </g>
27
+ <path d="M27.5 39.5l4.5 4.5 4.5-4.5" fill="none" stroke="#67e8f9" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/>
28
+ </svg>
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "SDLC Worker Guard",
4
+ "description": "Worker-side policy: tool and filesystem deciders. Worker profiles only."
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "SDLC Worker Guard",
4
+ "description": "Worker-side policy: tool and filesystem deciders. Worker profiles only."
5
+ }
6
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@patwoodman/dsh-sdlc-flow-guard",
3
- "version": "0.4.0-beta.17",
3
+ "version": "0.4.0-beta.20",
4
4
  "type": "module"
5
5
  }
@@ -0,0 +1,48 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://sdlc.dev/schemas/path-policy.schema.json",
4
+ "title": "SDLC guard path/command policy",
5
+ "description": "Version 1.0.0 of the fixed glob dialect published by spec v3 C.7.3: `*` matches within a path segment, `**` matches across segments, a leading `./` is stripped, matching is on the repo-relative POSIX path, and forbidden_paths is evaluated after allowed_paths (deny wins).",
6
+ "x-dialect-version": "1.0.0",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "allowed_paths": {
11
+ "type": "array",
12
+ "items": { "$ref": "#/$defs/glob" },
13
+ "description": "Paths the worker may write inside the worktree."
14
+ },
15
+ "forbidden_paths": {
16
+ "type": "array",
17
+ "items": { "$ref": "#/$defs/glob" },
18
+ "description": "Evaluated after allowed_paths; deny wins."
19
+ },
20
+ "forbidden_patterns": {
21
+ "type": "array",
22
+ "items": { "type": "string", "minLength": 1 },
23
+ "description": "Command patterns; `*` is a wildcard. Defence-in-depth only."
24
+ },
25
+ "forbidden_commands": {
26
+ "type": "array",
27
+ "items": { "type": "string", "minLength": 1 }
28
+ },
29
+ "orchestratorPaths": {
30
+ "type": "array",
31
+ "items": { "$ref": "#/$defs/glob" }
32
+ },
33
+ "protectedOrchestratorPaths": {
34
+ "type": "array",
35
+ "items": { "$ref": "#/$defs/glob" }
36
+ },
37
+ "guardMode": { "enum": ["deny", "warn"] },
38
+ "worktreeRoot": { "type": "string" }
39
+ },
40
+ "$defs": {
41
+ "glob": {
42
+ "type": "string",
43
+ "minLength": 1,
44
+ "pattern": "^[^\\u0000]*$",
45
+ "description": "Repo-relative POSIX glob. `..`, absolute paths and NUL are rejected at match time."
46
+ }
47
+ }
48
+ }