specweave 3.0.15 → 3.0.17

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 (155) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/README.md +12 -1
  3. package/bin/specweave.js +25 -7
  4. package/dist/plugins/specweave/lib/integrations/github/github-client-v2.js +2 -2
  5. package/dist/plugins/specweave/lib/integrations/github/github-client-v2.js.map +1 -1
  6. package/dist/src/cli/commands/auto-status.d.ts +0 -10
  7. package/dist/src/cli/commands/auto-status.d.ts.map +1 -1
  8. package/dist/src/cli/commands/auto-status.js +3 -2
  9. package/dist/src/cli/commands/auto-status.js.map +1 -1
  10. package/dist/src/cli/commands/auto.d.ts +0 -17
  11. package/dist/src/cli/commands/auto.d.ts.map +1 -1
  12. package/dist/src/cli/commands/auto.js +8 -14
  13. package/dist/src/cli/commands/auto.js.map +1 -1
  14. package/dist/src/cli/commands/get.d.ts +4 -0
  15. package/dist/src/cli/commands/get.d.ts.map +1 -1
  16. package/dist/src/cli/commands/get.js +15 -33
  17. package/dist/src/cli/commands/get.js.map +1 -1
  18. package/dist/src/cli/commands/qa.js +2 -2
  19. package/dist/src/cli/commands/qa.js.map +1 -1
  20. package/dist/src/cli/commands/save.js +1 -1
  21. package/dist/src/cli/commands/save.js.map +1 -1
  22. package/dist/src/cli/commands/sync-progress.d.ts +0 -10
  23. package/dist/src/cli/commands/sync-progress.d.ts.map +1 -1
  24. package/dist/src/cli/commands/sync-progress.js +21 -27
  25. package/dist/src/cli/commands/sync-progress.js.map +1 -1
  26. package/dist/src/cli/commands/task.js +1 -1
  27. package/dist/src/cli/commands/task.js.map +1 -1
  28. package/dist/src/cli/commands/update.js +1 -1
  29. package/dist/src/cli/commands/update.js.map +1 -1
  30. package/dist/src/cli/helpers/get/register-repo.d.ts +1 -11
  31. package/dist/src/cli/helpers/get/register-repo.d.ts.map +1 -1
  32. package/dist/src/cli/helpers/get/register-repo.js +6 -85
  33. package/dist/src/cli/helpers/get/register-repo.js.map +1 -1
  34. package/dist/src/cli/helpers/get/source-parser.d.ts +1 -1
  35. package/dist/src/cli/helpers/get/source-parser.d.ts.map +1 -1
  36. package/dist/src/cli/helpers/get/source-parser.js +4 -4
  37. package/dist/src/cli/helpers/get/source-parser.js.map +1 -1
  38. package/dist/src/cli/helpers/init/path-utils.d.ts +1 -1
  39. package/dist/src/cli/helpers/init/path-utils.d.ts.map +1 -1
  40. package/dist/src/cli/helpers/init/path-utils.js +44 -2
  41. package/dist/src/cli/helpers/init/path-utils.js.map +1 -1
  42. package/dist/src/cli/helpers/init/types.d.ts +1 -0
  43. package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
  44. package/dist/src/core/ac-test-validator-cli.js +1 -1
  45. package/dist/src/core/ac-test-validator-cli.js.map +1 -1
  46. package/dist/src/core/config/types.d.ts +3 -1
  47. package/dist/src/core/config/types.d.ts.map +1 -1
  48. package/dist/src/core/config/types.js.map +1 -1
  49. package/dist/src/core/doctor/checkers/increments-checker.js +2 -2
  50. package/dist/src/core/doctor/checkers/increments-checker.js.map +1 -1
  51. package/dist/src/core/hooks/handlers/hook-router.d.ts.map +1 -1
  52. package/dist/src/core/hooks/handlers/hook-router.js +5 -7
  53. package/dist/src/core/hooks/handlers/hook-router.js.map +1 -1
  54. package/dist/src/core/hooks/handlers/stop.d.ts.map +1 -1
  55. package/dist/src/core/hooks/handlers/stop.js +17 -14
  56. package/dist/src/core/hooks/handlers/stop.js.map +1 -1
  57. package/dist/src/core/hooks/handlers/utils.d.ts.map +1 -1
  58. package/dist/src/core/hooks/handlers/utils.js +7 -15
  59. package/dist/src/core/hooks/handlers/utils.js.map +1 -1
  60. package/dist/src/core/increment/duplicate-detector.d.ts +0 -8
  61. package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -1
  62. package/dist/src/core/increment/duplicate-detector.js +29 -13
  63. package/dist/src/core/increment/duplicate-detector.js.map +1 -1
  64. package/dist/src/core/increment/increment-archiver.d.ts +0 -6
  65. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  66. package/dist/src/core/increment/increment-archiver.js +12 -7
  67. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  68. package/dist/src/core/increment/increment-utils.d.ts +6 -6
  69. package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
  70. package/dist/src/core/increment/increment-utils.js +26 -27
  71. package/dist/src/core/increment/increment-utils.js.map +1 -1
  72. package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
  73. package/dist/src/core/increment/metadata-manager.js +20 -7
  74. package/dist/src/core/increment/metadata-manager.js.map +1 -1
  75. package/dist/src/core/increment/number-reservation.d.ts +16 -0
  76. package/dist/src/core/increment/number-reservation.d.ts.map +1 -0
  77. package/dist/src/core/increment/number-reservation.js +125 -0
  78. package/dist/src/core/increment/number-reservation.js.map +1 -0
  79. package/dist/src/core/increment/template-creator.d.ts.map +1 -1
  80. package/dist/src/core/increment/template-creator.js +11 -43
  81. package/dist/src/core/increment/template-creator.js.map +1 -1
  82. package/dist/src/core/living-docs/feature-archiver.js +3 -3
  83. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  84. package/dist/src/core/living-docs/feature-consistency-validator.js +1 -1
  85. package/dist/src/core/living-docs/feature-consistency-validator.js.map +1 -1
  86. package/dist/src/core/living-docs/feature-id-manager.js +2 -2
  87. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
  88. package/dist/src/core/living-docs/hierarchy-mapper.js +3 -3
  89. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
  90. package/dist/src/core/living-docs/living-docs-sync.js +1 -1
  91. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  92. package/dist/src/core/qa/qa-runner.d.ts +0 -6
  93. package/dist/src/core/qa/qa-runner.d.ts.map +1 -1
  94. package/dist/src/core/qa/qa-runner.js +8 -10
  95. package/dist/src/core/qa/qa-runner.js.map +1 -1
  96. package/dist/src/core/session/handoff-all.d.ts +2 -2
  97. package/dist/src/core/session/handoff-all.d.ts.map +1 -1
  98. package/dist/src/core/session/handoff-all.js +5 -3
  99. package/dist/src/core/session/handoff-all.js.map +1 -1
  100. package/dist/src/core/session/handoff-list.d.ts +0 -19
  101. package/dist/src/core/session/handoff-list.d.ts.map +1 -1
  102. package/dist/src/core/session/handoff-list.js +7 -4
  103. package/dist/src/core/session/handoff-list.js.map +1 -1
  104. package/dist/src/core/session/handoff-remote.d.ts +0 -19
  105. package/dist/src/core/session/handoff-remote.d.ts.map +1 -1
  106. package/dist/src/core/session/handoff-remote.js +3 -3
  107. package/dist/src/core/session/handoff-remote.js.map +1 -1
  108. package/dist/src/core/session/nested-repos.d.ts.map +1 -1
  109. package/dist/src/core/session/nested-repos.js +7 -1
  110. package/dist/src/core/session/nested-repos.js.map +1 -1
  111. package/dist/src/core/specs/spec-metadata-manager.js +1 -1
  112. package/dist/src/core/specs/spec-metadata-manager.js.map +1 -1
  113. package/dist/src/core/specs/spec-parser.js +1 -1
  114. package/dist/src/core/specs/spec-parser.js.map +1 -1
  115. package/dist/src/core/tasks/resolve-increment.d.ts.map +1 -1
  116. package/dist/src/core/tasks/resolve-increment.js +3 -2
  117. package/dist/src/core/tasks/resolve-increment.js.map +1 -1
  118. package/dist/src/core/types/increment-metadata.d.ts +2 -0
  119. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  120. package/dist/src/core/types/increment-metadata.js.map +1 -1
  121. package/dist/src/core/workspace/adoption.d.ts +21 -0
  122. package/dist/src/core/workspace/adoption.d.ts.map +1 -0
  123. package/dist/src/core/workspace/adoption.js +187 -0
  124. package/dist/src/core/workspace/adoption.js.map +1 -0
  125. package/dist/src/core/workspace/context.d.ts +21 -0
  126. package/dist/src/core/workspace/context.d.ts.map +1 -0
  127. package/dist/src/core/workspace/context.js +105 -0
  128. package/dist/src/core/workspace/context.js.map +1 -0
  129. package/dist/src/importers/item-converter.js +1 -1
  130. package/dist/src/importers/item-converter.js.map +1 -1
  131. package/dist/src/sync/github-reconciler.js +2 -2
  132. package/dist/src/sync/github-reconciler.js.map +1 -1
  133. package/dist/src/utils/external-tool-drift-detector.js +1 -1
  134. package/dist/src/utils/external-tool-drift-detector.js.map +1 -1
  135. package/dist/src/utils/feature-id-collision.js +1 -1
  136. package/dist/src/utils/feature-id-collision.js.map +1 -1
  137. package/dist/src/utils/find-project-root.d.ts.map +1 -1
  138. package/dist/src/utils/find-project-root.js +16 -36
  139. package/dist/src/utils/find-project-root.js.map +1 -1
  140. package/dist/src/utils/increment-id-validator.d.ts +27 -67
  141. package/dist/src/utils/increment-id-validator.d.ts.map +1 -1
  142. package/dist/src/utils/increment-id-validator.js +57 -106
  143. package/dist/src/utils/increment-id-validator.js.map +1 -1
  144. package/dist/src/utils/resolve-increment-id.d.ts +0 -22
  145. package/dist/src/utils/resolve-increment-id.d.ts.map +1 -1
  146. package/dist/src/utils/resolve-increment-id.js +17 -41
  147. package/dist/src/utils/resolve-increment-id.js.map +1 -1
  148. package/package.json +2 -1
  149. package/plugins/specweave/.claude-plugin/plugin.json +1 -1
  150. package/plugins/specweave/lib/integrations/github/github-client-v2.js +2 -2
  151. package/plugins/specweave/lib/integrations/github/github-client-v2.ts +2 -2
  152. package/src/core/schemas/specweave-config.schema.json +1130 -0
  153. package/src/core/schemas/sync.schema.json +687 -0
  154. package/src/core/schemas/workspace.schema.json +209 -0
  155. package/src/templates/git-hooks/pre-commit.template +4 -4
@@ -0,0 +1,687 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "description": "External sync configuration for multi-project support (GitHub, JIRA, ADO, etc.)",
5
+ "properties": {
6
+ "enabled": {
7
+ "type": "boolean",
8
+ "description": "Enable external tool synchronization (overall toggle)",
9
+ "default": false
10
+ },
11
+ "provider": {
12
+ "type": "string",
13
+ "description": "Active sync provider (EXCLUSIVE: choose ONE provider, not multiple)",
14
+ "enum": [
15
+ "github",
16
+ "jira",
17
+ "ado",
18
+ "none"
19
+ ],
20
+ "default": "none"
21
+ },
22
+ "includeStatus": {
23
+ "type": "boolean",
24
+ "description": "Include status synchronization (sync increment status to external tool)",
25
+ "default": true
26
+ },
27
+ "autoApplyLabels": {
28
+ "type": "boolean",
29
+ "description": "Automatically apply labels based on increment type ([Bug], [Feature], [Docs])",
30
+ "default": true
31
+ },
32
+ "defaultProfile": {
33
+ "type": "string",
34
+ "description": "Default sync profile"
35
+ },
36
+ "profiles": {
37
+ "type": "object",
38
+ "description": "All available sync profiles",
39
+ "patternProperties": {
40
+ "^[a-z0-9-]+$": {
41
+ "type": "object",
42
+ "description": "Sync profile configuration",
43
+ "properties": {
44
+ "provider": {
45
+ "type": "string",
46
+ "description": "External provider type",
47
+ "enum": [
48
+ "github",
49
+ "jira",
50
+ "ado"
51
+ ]
52
+ },
53
+ "displayName": {
54
+ "type": "string",
55
+ "description": "Human-readable profile name",
56
+ "minLength": 1,
57
+ "maxLength": 128
58
+ },
59
+ "description": {
60
+ "type": "string",
61
+ "description": "Profile description",
62
+ "maxLength": 512
63
+ },
64
+ "strategy": {
65
+ "type": "string",
66
+ "description": "Sync strategy: simple (one container), filtered (multiple containers + boards), custom (raw query)",
67
+ "enum": [
68
+ "simple",
69
+ "filtered",
70
+ "custom"
71
+ ],
72
+ "default": "simple"
73
+ },
74
+ "config": {
75
+ "type": "object",
76
+ "description": "Provider-specific configuration (backward compatible + hierarchical v0.10.0+)",
77
+ "properties": {
78
+ "owner": {
79
+ "type": "string",
80
+ "description": "GitHub owner (simple strategy)"
81
+ },
82
+ "repo": {
83
+ "type": "string",
84
+ "description": "GitHub repo (simple strategy)"
85
+ },
86
+ "monorepoProjects": {
87
+ "type": "array",
88
+ "description": "Monorepo projects within the repository (optional)",
89
+ "items": {
90
+ "type": "string",
91
+ "minLength": 1,
92
+ "maxLength": 64,
93
+ "pattern": "^[a-z0-9-]+$"
94
+ },
95
+ "minItems": 1
96
+ },
97
+ "domain": {
98
+ "type": "string",
99
+ "description": "Jira domain (all strategies)"
100
+ },
101
+ "projectKey": {
102
+ "type": "string",
103
+ "description": "Jira project key (simple strategy, backward compatible)"
104
+ },
105
+ "projects": {
106
+ "type": "array",
107
+ "description": "Jira project keys for project-per-team strategy (v0.8.19+)",
108
+ "items": {
109
+ "type": "string",
110
+ "minLength": 2,
111
+ "maxLength": 10,
112
+ "pattern": "^[A-Z0-9]+$"
113
+ },
114
+ "minItems": 1
115
+ },
116
+ "issueType": {
117
+ "type": "string",
118
+ "enum": [
119
+ "Epic",
120
+ "Story",
121
+ "Task"
122
+ ],
123
+ "description": "Jira issue type"
124
+ },
125
+ "organization": {
126
+ "type": "string",
127
+ "description": "ADO organization (all strategies)"
128
+ },
129
+ "project": {
130
+ "type": "string",
131
+ "description": "ADO project (simple strategy, backward compatible)"
132
+ },
133
+ "workItemType": {
134
+ "type": "string",
135
+ "enum": [
136
+ "Epic",
137
+ "Feature",
138
+ "User Story"
139
+ ],
140
+ "description": "ADO work item type"
141
+ },
142
+ "containers": {
143
+ "type": "array",
144
+ "description": "Containers for filtered strategy (v0.10.0+)",
145
+ "items": {
146
+ "type": "object",
147
+ "properties": {
148
+ "id": {
149
+ "type": "string",
150
+ "description": "Container ID (Jira project key, GitHub repo, ADO project)",
151
+ "minLength": 1
152
+ },
153
+ "subOrganizations": {
154
+ "type": "array",
155
+ "description": "Sub-organizations (boards, project boards, team boards)",
156
+ "items": {
157
+ "type": "string"
158
+ }
159
+ },
160
+ "filters": {
161
+ "type": "object",
162
+ "description": "Filters applied to this container",
163
+ "properties": {
164
+ "includeLabels": {
165
+ "type": "array",
166
+ "items": {
167
+ "type": "string"
168
+ }
169
+ },
170
+ "excludeLabels": {
171
+ "type": "array",
172
+ "items": {
173
+ "type": "string"
174
+ }
175
+ },
176
+ "assignees": {
177
+ "type": "array",
178
+ "items": {
179
+ "type": "string"
180
+ }
181
+ },
182
+ "statusCategories": {
183
+ "type": "array",
184
+ "items": {
185
+ "type": "string"
186
+ }
187
+ },
188
+ "components": {
189
+ "type": "array",
190
+ "items": {
191
+ "type": "string"
192
+ },
193
+ "description": "Jira components"
194
+ },
195
+ "sprints": {
196
+ "type": "array",
197
+ "items": {
198
+ "type": "string"
199
+ },
200
+ "description": "Jira sprints"
201
+ },
202
+ "issueTypes": {
203
+ "type": "array",
204
+ "items": {
205
+ "type": "string"
206
+ },
207
+ "description": "Jira issue types"
208
+ },
209
+ "milestones": {
210
+ "type": "array",
211
+ "items": {
212
+ "type": "string"
213
+ },
214
+ "description": "GitHub milestones"
215
+ },
216
+ "states": {
217
+ "type": "array",
218
+ "items": {
219
+ "type": "string",
220
+ "enum": [
221
+ "open",
222
+ "closed"
223
+ ]
224
+ },
225
+ "description": "GitHub states"
226
+ },
227
+ "areaPaths": {
228
+ "type": "array",
229
+ "items": {
230
+ "type": "string"
231
+ },
232
+ "description": "ADO area paths"
233
+ },
234
+ "iterationPaths": {
235
+ "type": "array",
236
+ "items": {
237
+ "type": "string"
238
+ },
239
+ "description": "ADO iteration paths"
240
+ },
241
+ "workItemTypes": {
242
+ "type": "array",
243
+ "items": {
244
+ "type": "string"
245
+ },
246
+ "description": "ADO work item types"
247
+ }
248
+ },
249
+ "additionalProperties": false
250
+ }
251
+ },
252
+ "required": [
253
+ "id"
254
+ ],
255
+ "additionalProperties": false
256
+ },
257
+ "minItems": 1
258
+ },
259
+ "customQuery": {
260
+ "type": "string",
261
+ "description": "Custom query for custom strategy (JQL/GraphQL/WIQL)",
262
+ "minLength": 1
263
+ }
264
+ },
265
+ "additionalProperties": false
266
+ },
267
+ "timeRange": {
268
+ "type": "object",
269
+ "description": "Time range configuration",
270
+ "properties": {
271
+ "default": {
272
+ "type": "string",
273
+ "description": "Default time range",
274
+ "enum": [
275
+ "1W",
276
+ "2W",
277
+ "1M",
278
+ "3M",
279
+ "6M",
280
+ "1Y",
281
+ "ALL"
282
+ ],
283
+ "default": "1M"
284
+ },
285
+ "max": {
286
+ "type": "string",
287
+ "description": "Maximum allowed time range",
288
+ "enum": [
289
+ "1W",
290
+ "2W",
291
+ "1M",
292
+ "3M",
293
+ "6M",
294
+ "1Y",
295
+ "ALL"
296
+ ],
297
+ "default": "6M"
298
+ }
299
+ },
300
+ "required": [
301
+ "default",
302
+ "max"
303
+ ]
304
+ },
305
+ "rateLimits": {
306
+ "type": "object",
307
+ "description": "Rate limiting configuration",
308
+ "properties": {
309
+ "maxItemsPerSync": {
310
+ "type": "number",
311
+ "description": "Maximum items to sync in one operation",
312
+ "minimum": 1,
313
+ "default": 500
314
+ },
315
+ "warnThreshold": {
316
+ "type": "number",
317
+ "description": "Warn when exceeding this threshold",
318
+ "minimum": 1,
319
+ "default": 100
320
+ }
321
+ }
322
+ },
323
+ "projectContext": {
324
+ "type": "object",
325
+ "description": "Project context for smart detection",
326
+ "properties": {
327
+ "name": {
328
+ "type": "string",
329
+ "description": "Project name"
330
+ },
331
+ "description": {
332
+ "type": "string",
333
+ "description": "Project description"
334
+ },
335
+ "keywords": {
336
+ "type": "array",
337
+ "description": "Keywords for auto-detection",
338
+ "items": {
339
+ "type": "string"
340
+ }
341
+ },
342
+ "team": {
343
+ "type": "string",
344
+ "description": "Team/organization name"
345
+ }
346
+ }
347
+ }
348
+ },
349
+ "required": [
350
+ "provider",
351
+ "displayName",
352
+ "config",
353
+ "timeRange"
354
+ ]
355
+ }
356
+ }
357
+ },
358
+ "projects": {
359
+ "type": "object",
360
+ "description": "Project contexts for organizing specs per project/team",
361
+ "patternProperties": {
362
+ "^[a-z0-9-]+$": {
363
+ "type": "object",
364
+ "description": "Project context",
365
+ "properties": {
366
+ "id": {
367
+ "type": "string",
368
+ "description": "Unique project identifier"
369
+ },
370
+ "name": {
371
+ "type": "string",
372
+ "description": "Project name"
373
+ },
374
+ "description": {
375
+ "type": "string",
376
+ "description": "Project description"
377
+ },
378
+ "team": {
379
+ "type": "string",
380
+ "description": "Team/organization"
381
+ },
382
+ "keywords": {
383
+ "type": "array",
384
+ "description": "Keywords for auto-detection",
385
+ "items": {
386
+ "type": "string"
387
+ }
388
+ },
389
+ "defaultSyncProfile": {
390
+ "type": "string",
391
+ "description": "Default sync profile for this project"
392
+ },
393
+ "specsFolder": {
394
+ "type": "string",
395
+ "description": "Project-specific specs folder path"
396
+ },
397
+ "increments": {
398
+ "type": "array",
399
+ "description": "Related increments",
400
+ "items": {
401
+ "type": "string"
402
+ }
403
+ }
404
+ },
405
+ "required": [
406
+ "id",
407
+ "name",
408
+ "description",
409
+ "keywords",
410
+ "specsFolder"
411
+ ]
412
+ }
413
+ }
414
+ },
415
+ "settings": {
416
+ "type": "object",
417
+ "description": "Global sync settings",
418
+ "properties": {
419
+ "autoDetectProject": {
420
+ "type": "boolean",
421
+ "description": "Auto-detect project from increment description",
422
+ "default": true
423
+ },
424
+ "autoCreateIssue": {
425
+ "type": "boolean",
426
+ "description": "Auto-create external issues (GitHub/Jira/ADO) when planning increments",
427
+ "default": false
428
+ },
429
+ "syncDirection": {
430
+ "type": "string",
431
+ "description": "Default sync direction between LOCAL (.specweave/) and EXTERNAL (GitHub/Jira/ADO). Options: 'bidirectional' (Local \u2194 External, recommended), 'to-external' (Local \u2192 External only), 'from-external' (External \u2192 Local only)",
432
+ "enum": [
433
+ "bidirectional",
434
+ "to-external",
435
+ "from-external"
436
+ ],
437
+ "default": "bidirectional"
438
+ },
439
+ "defaultTimeRange": {
440
+ "type": "string",
441
+ "description": "Default time range for new syncs",
442
+ "enum": [
443
+ "1W",
444
+ "2W",
445
+ "1M",
446
+ "3M",
447
+ "6M",
448
+ "1Y",
449
+ "ALL"
450
+ ],
451
+ "default": "1M"
452
+ },
453
+ "rateLimitProtection": {
454
+ "type": "boolean",
455
+ "description": "Enable rate limit protection",
456
+ "default": true
457
+ },
458
+ "conflictResolution": {
459
+ "type": "string",
460
+ "description": "How to resolve conflicts when both Local and External have changes. Options: 'prompt' (ask user), 'prefer-local' (Local wins), 'prefer-external' (External wins)",
461
+ "enum": [
462
+ "prompt",
463
+ "prefer-local",
464
+ "prefer-external"
465
+ ],
466
+ "default": "prompt"
467
+ }
468
+ }
469
+ },
470
+ "statusSync": {
471
+ "type": "object",
472
+ "description": "Status synchronization configuration between SpecWeave and external tools (v0.20.0+)",
473
+ "properties": {
474
+ "enabled": {
475
+ "type": "boolean",
476
+ "description": "Enable status synchronization",
477
+ "default": true
478
+ },
479
+ "autoSync": {
480
+ "type": "boolean",
481
+ "description": "Automatically sync status changes on increment state transitions",
482
+ "default": true
483
+ },
484
+ "promptUser": {
485
+ "type": "boolean",
486
+ "description": "Prompt user before syncing status to external tools",
487
+ "default": true
488
+ },
489
+ "conflictResolution": {
490
+ "type": "string",
491
+ "description": "Default conflict resolution strategy when local and external statuses differ",
492
+ "enum": [
493
+ "prompt",
494
+ "last-write-wins",
495
+ "specweave-wins",
496
+ "external-wins"
497
+ ],
498
+ "default": "prompt"
499
+ },
500
+ "mappings": {
501
+ "type": "object",
502
+ "description": "Status mappings for each external tool",
503
+ "properties": {
504
+ "github": {
505
+ "$ref": "#/definitions/statusMapping",
506
+ "description": "GitHub status mappings (open/closed with labels)"
507
+ },
508
+ "jira": {
509
+ "$ref": "#/definitions/statusMapping",
510
+ "description": "JIRA status mappings (workflow states)"
511
+ },
512
+ "ado": {
513
+ "$ref": "#/definitions/statusMapping",
514
+ "description": "Azure DevOps status mappings (work item states)"
515
+ }
516
+ }
517
+ }
518
+ }
519
+ }
520
+ },
521
+ "additionalProperties": false,
522
+ "definitions": {
523
+ "statusMapping": {
524
+ "type": "object",
525
+ "description": "Status mappings for a specific external tool",
526
+ "properties": {
527
+ "planning": {
528
+ "oneOf": [
529
+ {
530
+ "type": "string"
531
+ },
532
+ {
533
+ "type": "object",
534
+ "properties": {
535
+ "state": {
536
+ "type": "string"
537
+ },
538
+ "labels": {
539
+ "type": "array",
540
+ "items": {
541
+ "type": "string"
542
+ }
543
+ },
544
+ "tags": {
545
+ "type": "array",
546
+ "items": {
547
+ "type": "string"
548
+ }
549
+ }
550
+ },
551
+ "required": [
552
+ "state"
553
+ ]
554
+ }
555
+ ]
556
+ },
557
+ "active": {
558
+ "oneOf": [
559
+ {
560
+ "type": "string"
561
+ },
562
+ {
563
+ "type": "object",
564
+ "properties": {
565
+ "state": {
566
+ "type": "string"
567
+ },
568
+ "labels": {
569
+ "type": "array",
570
+ "items": {
571
+ "type": "string"
572
+ }
573
+ },
574
+ "tags": {
575
+ "type": "array",
576
+ "items": {
577
+ "type": "string"
578
+ }
579
+ }
580
+ },
581
+ "required": [
582
+ "state"
583
+ ]
584
+ }
585
+ ]
586
+ },
587
+ "paused": {
588
+ "oneOf": [
589
+ {
590
+ "type": "string"
591
+ },
592
+ {
593
+ "type": "object",
594
+ "properties": {
595
+ "state": {
596
+ "type": "string"
597
+ },
598
+ "labels": {
599
+ "type": "array",
600
+ "items": {
601
+ "type": "string"
602
+ }
603
+ },
604
+ "tags": {
605
+ "type": "array",
606
+ "items": {
607
+ "type": "string"
608
+ }
609
+ }
610
+ },
611
+ "required": [
612
+ "state"
613
+ ]
614
+ }
615
+ ]
616
+ },
617
+ "completed": {
618
+ "oneOf": [
619
+ {
620
+ "type": "string"
621
+ },
622
+ {
623
+ "type": "object",
624
+ "properties": {
625
+ "state": {
626
+ "type": "string"
627
+ },
628
+ "labels": {
629
+ "type": "array",
630
+ "items": {
631
+ "type": "string"
632
+ }
633
+ },
634
+ "tags": {
635
+ "type": "array",
636
+ "items": {
637
+ "type": "string"
638
+ }
639
+ }
640
+ },
641
+ "required": [
642
+ "state"
643
+ ]
644
+ }
645
+ ]
646
+ },
647
+ "abandoned": {
648
+ "oneOf": [
649
+ {
650
+ "type": "string"
651
+ },
652
+ {
653
+ "type": "object",
654
+ "properties": {
655
+ "state": {
656
+ "type": "string"
657
+ },
658
+ "labels": {
659
+ "type": "array",
660
+ "items": {
661
+ "type": "string"
662
+ }
663
+ },
664
+ "tags": {
665
+ "type": "array",
666
+ "items": {
667
+ "type": "string"
668
+ }
669
+ }
670
+ },
671
+ "required": [
672
+ "state"
673
+ ]
674
+ }
675
+ ]
676
+ }
677
+ },
678
+ "required": [
679
+ "planning",
680
+ "active",
681
+ "paused",
682
+ "completed",
683
+ "abandoned"
684
+ ]
685
+ }
686
+ }
687
+ }