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,1130 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "SpecWeave Configuration",
4
+ "description": "Schema for .specweave/config.yaml configuration file",
5
+ "type": "object",
6
+ "properties": {
7
+ "plugins": {
8
+ "type": "object",
9
+ "description": "Plugin configuration",
10
+ "properties": {
11
+ "enabled": {
12
+ "type": "array",
13
+ "description": "List of enabled plugin names",
14
+ "items": {
15
+ "type": "string",
16
+ "pattern": "^specweave-[a-z0-9-]+$"
17
+ },
18
+ "uniqueItems": true,
19
+ "examples": [
20
+ ["specweave-github", "specweave-frontend-stack"]
21
+ ]
22
+ },
23
+ "settings": {
24
+ "type": "object",
25
+ "description": "Plugin-specific settings",
26
+ "patternProperties": {
27
+ "^specweave-[a-z0-9-]+$": {
28
+ "type": "object",
29
+ "description": "Settings for a specific plugin"
30
+ }
31
+ },
32
+ "additionalProperties": false
33
+ }
34
+ },
35
+ "required": ["enabled"],
36
+ "additionalProperties": false
37
+ },
38
+ "project": {
39
+ "type": "object",
40
+ "description": "Project metadata",
41
+ "properties": {
42
+ "name": {
43
+ "type": "string",
44
+ "description": "Project name",
45
+ "minLength": 1,
46
+ "maxLength": 256
47
+ },
48
+ "version": {
49
+ "type": "string",
50
+ "description": "Project version (semver)",
51
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[a-z0-9.-]+)?(\\+[a-z0-9.-]+)?$"
52
+ },
53
+ "description": {
54
+ "type": "string",
55
+ "description": "Project description",
56
+ "maxLength": 1024
57
+ }
58
+ },
59
+ "additionalProperties": true
60
+ },
61
+ "adapters": {
62
+ "type": "object",
63
+ "description": "Adapter configuration",
64
+ "properties": {
65
+ "default": {
66
+ "type": "string",
67
+ "description": "Default adapter to use",
68
+ "enum": ["claude", "cursor", "copilot", "generic"]
69
+ }
70
+ },
71
+ "additionalProperties": true
72
+ },
73
+ "language": {
74
+ "type": "string",
75
+ "description": "Primary language for generated content and CLI",
76
+ "enum": ["en", "ru", "es", "zh", "de", "fr", "ja", "ko", "pt"],
77
+ "default": "en"
78
+ },
79
+ "limits": {
80
+ "type": "object",
81
+ "description": "Advisory WIP limit (2.0). No hard cap: exceeding it prints one info note and never blocks.",
82
+ "properties": {
83
+ "activeIncrements": {
84
+ "type": "number",
85
+ "description": "Recommended maximum active increments. 0 disables the note.",
86
+ "minimum": 0,
87
+ "default": 3
88
+ }
89
+ },
90
+ "additionalProperties": false
91
+ },
92
+ "hooks": {
93
+ "type": "object",
94
+ "description": "Hook configuration for lifecycle automation (Claude Code only)",
95
+ "properties": {
96
+ "post_task_completion": {
97
+ "type": "object",
98
+ "description": "Post-task completion hook settings",
99
+ "properties": {
100
+ "sync_tasks_md": {
101
+ "type": "boolean",
102
+ "description": "Update tasks.md with completion status",
103
+ "default": true
104
+ },
105
+ "external_tracker_sync": {
106
+ "type": "boolean",
107
+ "description": "Sync to external tracker (GitHub Issues, Jira, ADO) on each task completion. Disable to reduce API calls; sync happens on increment open/close instead.",
108
+ "default": false
109
+ }
110
+ },
111
+ "additionalProperties": false
112
+ },
113
+ "post_increment_planning": {
114
+ "type": "object",
115
+ "description": "Post-increment planning hook settings",
116
+ "properties": {
117
+ "auto_create_github_issue": {
118
+ "type": "boolean",
119
+ "description": "Automatically create GitHub issue after increment planning",
120
+ "default": true
121
+ },
122
+ "sync_living_docs": {
123
+ "type": "boolean",
124
+ "description": "Sync living docs after increment planning (before external issue creation)",
125
+ "default": true
126
+ }
127
+ },
128
+ "additionalProperties": false
129
+ },
130
+ "post_increment_done": {
131
+ "type": "object",
132
+ "description": "Post-increment done hook settings (MANDATORY for GitHub Project sync)",
133
+ "properties": {
134
+ "sync_living_docs": {
135
+ "type": "boolean",
136
+ "description": "Sync specs to living docs when increment closes",
137
+ "default": true
138
+ },
139
+ "sync_to_github_project": {
140
+ "type": "boolean",
141
+ "description": "MANDATORY: Automatically sync living docs spec to GitHub Project when increment closes (ensures source of truth integrity)",
142
+ "default": true
143
+ },
144
+ "close_github_issue": {
145
+ "type": "boolean",
146
+ "description": "Automatically close GitHub issue when increment closes",
147
+ "default": true
148
+ },
149
+ "update_living_docs_first": {
150
+ "type": "boolean",
151
+ "description": "Ensure living docs are synced before GitHub Project sync",
152
+ "default": true
153
+ }
154
+ },
155
+ "additionalProperties": false,
156
+ "required": ["sync_to_github_project"]
157
+ }
158
+ },
159
+ "additionalProperties": false
160
+ },
161
+ "statusLine": {
162
+ "type": "object",
163
+ "description": "Status line configuration (simplified). Shows: [increment-name] ████░░░░ X/Y tasks (Z open)",
164
+ "properties": {
165
+ "enabled": {
166
+ "type": "boolean",
167
+ "description": "Enable status line rendering",
168
+ "default": true
169
+ },
170
+ "maxCacheAge": {
171
+ "type": "number",
172
+ "description": "Maximum age of cache before showing stale warning (milliseconds)",
173
+ "default": 30000,
174
+ "minimum": 5000,
175
+ "maximum": 120000
176
+ },
177
+ "progressBarWidth": {
178
+ "type": "number",
179
+ "description": "Width of progress bar in characters",
180
+ "default": 8,
181
+ "minimum": 4,
182
+ "maximum": 20
183
+ },
184
+ "maxNameLength": {
185
+ "type": "number",
186
+ "description": "Maximum length for increment name display",
187
+ "default": 30,
188
+ "minimum": 10,
189
+ "maximum": 50
190
+ }
191
+ },
192
+ "additionalProperties": false
193
+ },
194
+ "translation": {
195
+ "type": "object",
196
+ "description": "Translation settings for multilingual support",
197
+ "properties": {
198
+ "enabled": {
199
+ "type": "boolean",
200
+ "description": "Enable/disable translation system entirely",
201
+ "default": true
202
+ },
203
+ "method": {
204
+ "type": "string",
205
+ "description": "Translation method (always in-session for zero cost)",
206
+ "enum": ["in-session"],
207
+ "default": "in-session"
208
+ },
209
+ "autoTranslateInternalDocs": {
210
+ "type": "boolean",
211
+ "description": "Automatically translate increment files (spec.md, plan.md, tasks.md) and living docs specs to English after increment planning (recommended: true)",
212
+ "default": true
213
+ },
214
+ "autoTranslateLivingDocs": {
215
+ "type": "boolean",
216
+ "description": "Automatically translate living docs to English after task completion (ADRs, HLDs, etc.)",
217
+ "default": true
218
+ },
219
+ "keepFrameworkTerms": {
220
+ "type": "boolean",
221
+ "description": "Keep framework terms (Increment, Living Docs, SpecWeave, ADR, RFC) in English",
222
+ "default": true
223
+ },
224
+ "keepTechnicalTerms": {
225
+ "type": "boolean",
226
+ "description": "Keep technical terms (Git, Docker, Kubernetes, npm, TypeScript) in English",
227
+ "default": true
228
+ },
229
+ "translateCodeComments": {
230
+ "type": "boolean",
231
+ "description": "Translate comments in generated code",
232
+ "default": true
233
+ },
234
+ "translateVariableNames": {
235
+ "type": "boolean",
236
+ "description": "Translate variable/function names (NOT RECOMMENDED)",
237
+ "default": false
238
+ },
239
+ "filesAlwaysInEnglish": {
240
+ "type": "array",
241
+ "description": "File patterns that must always be in English (glob patterns)",
242
+ "items": {
243
+ "type": "string"
244
+ },
245
+ "default": [
246
+ "spec.md",
247
+ "plan.md",
248
+ "tasks.md",
249
+ "tests.md",
250
+ "docs/internal/**/*.md"
251
+ ]
252
+ },
253
+ "translationModel": {
254
+ "type": "string",
255
+ "description": "LLM model to use for translation",
256
+ "enum": ["haiku", "sonnet", "opus"],
257
+ "default": "haiku"
258
+ }
259
+ },
260
+ "additionalProperties": false
261
+ },
262
+ "multiProject": {
263
+ "type": "object",
264
+ "description": "DEPRECATED: Use workspace instead. Multi-project configuration for internal docs organization.",
265
+ "properties": {
266
+ "enabled": {
267
+ "type": "boolean",
268
+ "description": "Enable multi-project mode (false = single project using projects/default/)",
269
+ "default": false
270
+ },
271
+ "projects": {
272
+ "type": "array",
273
+ "description": "Available projects",
274
+ "items": {
275
+ "type": "object",
276
+ "description": "Project configuration",
277
+ "properties": {
278
+ "id": {
279
+ "type": "string",
280
+ "description": "Unique project identifier (kebab-case)",
281
+ "pattern": "^[a-z0-9-]+$",
282
+ "minLength": 1,
283
+ "maxLength": 64
284
+ },
285
+ "name": {
286
+ "type": "string",
287
+ "description": "Project display name",
288
+ "minLength": 1,
289
+ "maxLength": 128
290
+ },
291
+ "description": {
292
+ "type": "string",
293
+ "description": "Project description",
294
+ "maxLength": 512
295
+ },
296
+ "techStack": {
297
+ "type": "array",
298
+ "description": "Technologies used in this project",
299
+ "items": {
300
+ "type": "string"
301
+ },
302
+ "default": []
303
+ },
304
+ "team": {
305
+ "type": "string",
306
+ "description": "Team or organization name",
307
+ "minLength": 1,
308
+ "maxLength": 128
309
+ },
310
+ "contacts": {
311
+ "type": "object",
312
+ "description": "Project contacts",
313
+ "properties": {
314
+ "lead": {
315
+ "type": "string",
316
+ "description": "Tech lead email",
317
+ "format": "email"
318
+ },
319
+ "pm": {
320
+ "type": "string",
321
+ "description": "Product manager email",
322
+ "format": "email"
323
+ }
324
+ },
325
+ "additionalProperties": false
326
+ },
327
+ "syncProfiles": {
328
+ "type": "array",
329
+ "description": "Linked sync profiles from sync.profiles (references profile IDs)",
330
+ "items": {
331
+ "type": "string"
332
+ },
333
+ "default": []
334
+ }
335
+ },
336
+ "required": ["id", "name", "description", "team"],
337
+ "additionalProperties": false
338
+ },
339
+ "minItems": 1
340
+ }
341
+ },
342
+ "additionalProperties": false
343
+ },
344
+ "brownfield": {
345
+ "type": "object",
346
+ "description": "Brownfield documentation import tracking",
347
+ "properties": {
348
+ "importHistory": {
349
+ "type": "array",
350
+ "description": "History of all brownfield imports",
351
+ "items": {
352
+ "type": "object",
353
+ "description": "Single import record",
354
+ "properties": {
355
+ "source": {
356
+ "type": "string",
357
+ "description": "Source type",
358
+ "enum": ["notion", "confluence", "wiki", "custom"]
359
+ },
360
+ "workspace": {
361
+ "type": "string",
362
+ "description": "Source workspace/space name"
363
+ },
364
+ "importedAt": {
365
+ "type": "string",
366
+ "description": "ISO 8601 timestamp of import",
367
+ "format": "date-time"
368
+ },
369
+ "project": {
370
+ "type": "string",
371
+ "description": "Target project ID",
372
+ "pattern": "^[a-z0-9-]+$"
373
+ },
374
+ "filesImported": {
375
+ "type": "number",
376
+ "description": "Total number of files imported",
377
+ "minimum": 0
378
+ },
379
+ "destination": {
380
+ "type": "string",
381
+ "description": "Destination path"
382
+ }
383
+ },
384
+ "required": ["source", "importedAt", "project", "filesImported", "destination"],
385
+ "additionalProperties": false
386
+ },
387
+ "default": []
388
+ }
389
+ },
390
+ "additionalProperties": false
391
+ },
392
+ "documentation": {
393
+ "type": "object",
394
+ "description": "Documentation configuration — directories and preview",
395
+ "properties": {
396
+ "directories": {
397
+ "type": "array",
398
+ "description": "Directories to search for documentation (relative to project root)",
399
+ "items": { "type": "string" },
400
+ "default": [".specweave/docs"]
401
+ },
402
+ "preview": {
403
+ "type": "object",
404
+ "description": "Local documentation preview settings",
405
+ "properties": {
406
+ "enabled": {
407
+ "type": "boolean",
408
+ "description": "Enable documentation preview feature",
409
+ "default": true
410
+ },
411
+ "autoInstall": {
412
+ "type": "boolean",
413
+ "description": "Automatically install Docusaurus dependencies (lazy install on first use recommended)",
414
+ "default": false
415
+ },
416
+ "port": {
417
+ "type": "number",
418
+ "description": "Default port for internal docs preview (3015 for internal, 3016 for public)",
419
+ "minimum": 1024,
420
+ "maximum": 65535,
421
+ "default": 3015
422
+ },
423
+ "openBrowser": {
424
+ "type": "boolean",
425
+ "description": "Automatically open browser when server starts",
426
+ "default": true
427
+ },
428
+ "theme": {
429
+ "type": "string",
430
+ "description": "Documentation theme",
431
+ "enum": ["default", "classic", "dark"],
432
+ "default": "default"
433
+ },
434
+ "excludeFolders": {
435
+ "type": "array",
436
+ "description": "Folders to exclude from documentation",
437
+ "items": {
438
+ "type": "string"
439
+ },
440
+ "default": ["legacy", "node_modules"]
441
+ }
442
+ },
443
+ "additionalProperties": false
444
+ }
445
+ },
446
+ "additionalProperties": false
447
+ },
448
+ "reflection": {
449
+ "type": "object",
450
+ "description": "AI Self-Reflection System configuration (v0.12.0+)",
451
+ "properties": {
452
+ "enabled": {
453
+ "type": "boolean",
454
+ "description": "Enable/disable reflection system entirely",
455
+ "default": true
456
+ },
457
+ "mode": {
458
+ "type": "string",
459
+ "description": "Reflection execution mode",
460
+ "enum": ["auto", "manual", "disabled"],
461
+ "default": "auto"
462
+ },
463
+ "depth": {
464
+ "type": "string",
465
+ "description": "Analysis depth level",
466
+ "enum": ["quick", "standard", "deep"],
467
+ "default": "standard"
468
+ },
469
+ "model": {
470
+ "type": "string",
471
+ "description": "AI model for reflection analysis",
472
+ "enum": ["haiku", "sonnet", "opus"],
473
+ "default": "haiku"
474
+ },
475
+ "categories": {
476
+ "type": "object",
477
+ "description": "Enable/disable specific analysis categories",
478
+ "properties": {
479
+ "security": {
480
+ "type": "boolean",
481
+ "description": "Security vulnerability detection (OWASP Top 10)",
482
+ "default": true
483
+ },
484
+ "quality": {
485
+ "type": "boolean",
486
+ "description": "Code quality and best practices analysis",
487
+ "default": true
488
+ },
489
+ "testing": {
490
+ "type": "boolean",
491
+ "description": "Test coverage and quality analysis",
492
+ "default": true
493
+ },
494
+ "performance": {
495
+ "type": "boolean",
496
+ "description": "Performance issue detection",
497
+ "default": true
498
+ },
499
+ "technicalDebt": {
500
+ "type": "boolean",
501
+ "description": "Technical debt tracking",
502
+ "default": true
503
+ }
504
+ },
505
+ "additionalProperties": false
506
+ },
507
+ "criticalThreshold": {
508
+ "type": "string",
509
+ "description": "Minimum severity to show terminal warnings",
510
+ "enum": ["CRITICAL", "HIGH", "MEDIUM", "LOW"],
511
+ "default": "MEDIUM"
512
+ },
513
+ "storeReflections": {
514
+ "type": "boolean",
515
+ "description": "Store reflections to log files",
516
+ "default": true
517
+ },
518
+ "autoCreateFollowUpTasks": {
519
+ "type": "boolean",
520
+ "description": "Automatically create tasks for critical issues",
521
+ "default": false
522
+ },
523
+ "soundNotifications": {
524
+ "type": "boolean",
525
+ "description": "Play sound for critical issues (optional)",
526
+ "default": false
527
+ }
528
+ },
529
+ "additionalProperties": false
530
+ },
531
+ "externalModels": {
532
+ "type": "object",
533
+ "description": "External model API consent configuration. Controls user consent for paid API calls (Anthropic, OpenAI, Azure, etc.)",
534
+ "properties": {
535
+ "consent": {
536
+ "type": "string",
537
+ "description": "Consent mode: ask (prompt user before external API calls), always-allow (skip consent), never (block all external APIs, use fallbacks)",
538
+ "enum": ["ask", "always-allow", "never"],
539
+ "default": "ask"
540
+ },
541
+ "allowedProviders": {
542
+ "type": "array",
543
+ "description": "Providers with standing consent (skip future prompts)",
544
+ "items": {
545
+ "type": "string",
546
+ "enum": ["anthropic", "openai", "azure-openai", "bedrock", "vertex-ai"]
547
+ },
548
+ "uniqueItems": true,
549
+ "default": []
550
+ }
551
+ },
552
+ "additionalProperties": false
553
+ },
554
+ "tasks": {
555
+ "type": "object",
556
+ "description": "Task-ledger settings (2.0)",
557
+ "properties": {
558
+ "leaseHours": {
559
+ "type": "number",
560
+ "minimum": 0,
561
+ "default": 2,
562
+ "description": "Hours before an unfinished task claim goes stale and may be taken over"
563
+ }
564
+ }
565
+ },
566
+ "testing": {
567
+ "type": "object",
568
+ "description": "Testing configuration including TDD mode, coverage targets, and browser automation",
569
+ "properties": {
570
+ "defaultTestMode": {
571
+ "type": "string",
572
+ "description": "Default test mode for new increments",
573
+ "enum": ["TDD", "test-first", "test-after"],
574
+ "default": "test-after"
575
+ },
576
+ "defaultCoverageTarget": {
577
+ "type": "number",
578
+ "description": "Default code coverage target percentage",
579
+ "minimum": 0,
580
+ "maximum": 100,
581
+ "default": 80
582
+ },
583
+ "coverageTargets": {
584
+ "type": "object",
585
+ "description": "Per-level coverage targets",
586
+ "properties": {
587
+ "unit": {
588
+ "type": "number",
589
+ "description": "Unit test line coverage target (Istanbul/c8 percentage)",
590
+ "minimum": 0,
591
+ "maximum": 100,
592
+ "default": 80
593
+ },
594
+ "integration": {
595
+ "type": "number",
596
+ "description": "Integration test line coverage target (Istanbul/c8 percentage)",
597
+ "minimum": 0,
598
+ "maximum": 100,
599
+ "default": 70
600
+ },
601
+ "e2e": {
602
+ "type": "number",
603
+ "description": "E2E test pass-rate target (percentage of written Playwright tests that must pass, not line coverage)",
604
+ "minimum": 0,
605
+ "maximum": 100,
606
+ "default": 100
607
+ }
608
+ },
609
+ "additionalProperties": false
610
+ },
611
+ "tddEnforcement": {
612
+ "type": "string",
613
+ "description": "TDD enforcement level: strict blocks GREEN without RED, warn shows warning, off disables",
614
+ "enum": ["strict", "warn", "off"],
615
+ "default": "warn"
616
+ },
617
+ "playwright": {
618
+ "type": "object",
619
+ "description": "Playwright browser automation configuration for dual-mode (CLI vs MCP)",
620
+ "properties": {
621
+ "preferCli": {
622
+ "type": "boolean",
623
+ "description": "Prefer @playwright/cli over MCP plugin for automation tasks (98% token reduction). Set false to always use MCP.",
624
+ "default": true
625
+ },
626
+ "cliFlags": {
627
+ "type": "array",
628
+ "description": "Additional flags to pass to playwright-cli commands",
629
+ "items": {
630
+ "type": "string"
631
+ }
632
+ }
633
+ },
634
+ "additionalProperties": false
635
+ }
636
+ },
637
+ "additionalProperties": false
638
+ },
639
+ "sync": { "$ref": "./sync.schema.json" },
640
+ "livingDocs": {
641
+ "type": "object",
642
+ "description": "Living documentation sync configuration (v0.18.0+)",
643
+ "properties": {
644
+ "intelligent": {
645
+ "type": "object",
646
+ "description": "Intelligent living docs sync - automatically classify and distribute spec content",
647
+ "properties": {
648
+ "enabled": {
649
+ "type": "boolean",
650
+ "description": "Enable intelligent sync mode (parse, classify, distribute). If false, uses simple copy mode.",
651
+ "default": false
652
+ },
653
+ "splitByCategory": {
654
+ "type": "boolean",
655
+ "description": "Split spec into separate files by category (User Stories, Architecture, Operations, etc.)",
656
+ "default": true
657
+ },
658
+ "generateCrossLinks": {
659
+ "type": "boolean",
660
+ "description": "Generate cross-references between related documents for traceability",
661
+ "default": true
662
+ },
663
+ "preserveOriginal": {
664
+ "type": "boolean",
665
+ "description": "Keep original monolithic spec.md in archive folder for reference",
666
+ "default": true
667
+ },
668
+ "classificationConfidenceThreshold": {
669
+ "type": "number",
670
+ "description": "Minimum confidence (0.0-1.0) for automatic classification. Sections below threshold go to Unknown category.",
671
+ "minimum": 0,
672
+ "maximum": 1,
673
+ "default": 0.6
674
+ },
675
+ "fallbackProject": {
676
+ "type": "string",
677
+ "description": "Default project ID when project cannot be detected from increment name/metadata",
678
+ "default": "default",
679
+ "minLength": 1,
680
+ "maxLength": 64,
681
+ "pattern": "^[a-z0-9-]+$"
682
+ }
683
+ },
684
+ "additionalProperties": false
685
+ }
686
+ },
687
+ "additionalProperties": false
688
+ },
689
+ "workspace": { "$ref": "./workspace.schema.json" },
690
+ "projectMappings": {
691
+ "type": "object",
692
+ "description": "DEPRECATED: Use workspace.repos[].sync instead. Cross-project targeting (v0.33.0+).",
693
+ "patternProperties": {
694
+ "^[a-z0-9-]+$": {
695
+ "type": "object",
696
+ "description": "External tool mappings for a project",
697
+ "properties": {
698
+ "github": {
699
+ "type": "object",
700
+ "description": "GitHub repository mapping",
701
+ "properties": {
702
+ "owner": {
703
+ "type": "string",
704
+ "description": "GitHub owner (org or user)",
705
+ "minLength": 1
706
+ },
707
+ "repo": {
708
+ "type": "string",
709
+ "description": "GitHub repository name",
710
+ "minLength": 1
711
+ }
712
+ },
713
+ "required": ["owner", "repo"],
714
+ "additionalProperties": false
715
+ },
716
+ "jira": {
717
+ "type": "object",
718
+ "description": "JIRA project mapping",
719
+ "properties": {
720
+ "project": {
721
+ "type": "string",
722
+ "description": "JIRA project key (e.g., 'FE', 'BE', 'SECURITY')",
723
+ "minLength": 1
724
+ },
725
+ "board": {
726
+ "type": "string",
727
+ "description": "JIRA board name (for 2-level)",
728
+ "minLength": 1
729
+ }
730
+ },
731
+ "required": ["project"],
732
+ "additionalProperties": false
733
+ },
734
+ "ado": {
735
+ "type": "object",
736
+ "description": "Azure DevOps project mapping",
737
+ "properties": {
738
+ "project": {
739
+ "type": "string",
740
+ "description": "ADO project name",
741
+ "minLength": 1
742
+ },
743
+ "areaPath": {
744
+ "type": "string",
745
+ "description": "ADO area path (e.g., 'infrastructure/security')",
746
+ "minLength": 1
747
+ }
748
+ },
749
+ "required": ["project"],
750
+ "additionalProperties": false
751
+ }
752
+ },
753
+ "additionalProperties": false
754
+ }
755
+ },
756
+ "additionalProperties": false
757
+ },
758
+ "specs": {
759
+ "type": "object",
760
+ "description": "Spec identifier and sync configuration for flexible multi-project architecture (v0.16.0+)",
761
+ "properties": {
762
+ "identifierStrategy": {
763
+ "type": "string",
764
+ "description": "Default identifier strategy for new specs: auto (detect from context), external (JIRA/ADO/GitHub), custom (user-defined), title-slug (from spec title), sequential (001, 002, ...)",
765
+ "enum": ["auto", "external", "custom", "title-slug", "sequential"],
766
+ "default": "auto"
767
+ },
768
+ "preferTitleSlug": {
769
+ "type": "boolean",
770
+ "description": "Prefer title-based slugs over sequential numbers when no external ID exists",
771
+ "default": true
772
+ },
773
+ "minSlugLength": {
774
+ "type": "number",
775
+ "description": "Minimum length for title slugs to be considered valid",
776
+ "minimum": 3,
777
+ "maximum": 20,
778
+ "default": 5
779
+ },
780
+ "projects": {
781
+ "type": "object",
782
+ "description": "Project-specific spec configurations for multi-project sync (backend, frontend, mobile, infra, _parent, etc.)",
783
+ "patternProperties": {
784
+ "^[a-z0-9-_]+$": {
785
+ "type": "object",
786
+ "description": "Project configuration for spec sync",
787
+ "properties": {
788
+ "id": {
789
+ "type": "string",
790
+ "description": "Unique project identifier (must match PROJECT_CODES in spec-identifier.ts: backend, frontend, mobile, infra, _parent, default)",
791
+ "pattern": "^[a-z0-9-_]+$",
792
+ "minLength": 1,
793
+ "maxLength": 64
794
+ },
795
+ "displayName": {
796
+ "type": "string",
797
+ "description": "Human-readable project name",
798
+ "minLength": 1,
799
+ "maxLength": 128
800
+ },
801
+ "description": {
802
+ "type": "string",
803
+ "description": "Project description",
804
+ "maxLength": 512
805
+ },
806
+ "github": {
807
+ "type": ["object", "null"],
808
+ "description": "GitHub repository configuration (null = no sync, e.g., _parent project)",
809
+ "properties": {
810
+ "owner": {
811
+ "type": "string",
812
+ "description": "GitHub repository owner (organization or user)",
813
+ "minLength": 1,
814
+ "maxLength": 128
815
+ },
816
+ "repo": {
817
+ "type": "string",
818
+ "description": "GitHub repository name",
819
+ "minLength": 1,
820
+ "maxLength": 128
821
+ }
822
+ },
823
+ "required": ["owner", "repo"],
824
+ "additionalProperties": false
825
+ },
826
+ "defaultLabels": {
827
+ "type": "array",
828
+ "description": "Default labels for GitHub issues created from specs in this project",
829
+ "items": {
830
+ "type": "string",
831
+ "minLength": 1,
832
+ "maxLength": 64
833
+ },
834
+ "default": []
835
+ },
836
+ "team": {
837
+ "type": "string",
838
+ "description": "Team or organization name responsible for this project",
839
+ "maxLength": 128
840
+ },
841
+ "syncEnabled": {
842
+ "type": "boolean",
843
+ "description": "Enable GitHub sync for specs in this project (false = specs remain local-only)",
844
+ "default": true
845
+ }
846
+ },
847
+ "required": ["id", "displayName"],
848
+ "additionalProperties": false
849
+ }
850
+ },
851
+ "additionalProperties": false
852
+ }
853
+ },
854
+ "additionalProperties": false
855
+ },
856
+ "pluginAutoLoad": {
857
+ "type": "object",
858
+ "description": "Plugin auto-load configuration (v1.0.140+). Controls automatic plugin detection using LLM.",
859
+ "properties": {
860
+ "enabled": {
861
+ "type": "boolean",
862
+ "description": "Enable automatic plugin detection and installation. When true, uses Claude Haiku to analyze prompts (~5-6s overhead). When false, disables detection for maximum speed.",
863
+ "default": true
864
+ },
865
+ "suggestOnly": {
866
+ "type": "boolean",
867
+ "description": "When true, detected plugins are suggested with install commands but not auto-installed. User must install manually and restart the session. When false, plugins are installed automatically without asking.",
868
+ "default": true
869
+ }
870
+ },
871
+ "additionalProperties": false
872
+ },
873
+ "incrementAssist": {
874
+ "type": "object",
875
+ "description": "Increment assist configuration (v1.0.141+). Controls intelligent increment creation suggestions using LLM.",
876
+ "properties": {
877
+ "enabled": {
878
+ "type": "boolean",
879
+ "description": "Enable increment creation suggestions. When true, LLM analyzes prompts and suggests creating/reopening increments or proceeding without one. When false, disables suggestions for maximum speed.",
880
+ "default": true
881
+ },
882
+ "suggestNewIncrement": {
883
+ "type": "boolean",
884
+ "description": "Suggest creating new increments for feature work, multi-file changes, new functionality that should be spec'd and tracked.",
885
+ "default": true
886
+ },
887
+ "suggestReopen": {
888
+ "type": "boolean",
889
+ "description": "Suggest reopening existing increments when user mentions work related to recent increments (e.g., 'the login feature is broken').",
890
+ "default": true
891
+ },
892
+ "confidenceThreshold": {
893
+ "type": "number",
894
+ "description": "Minimum confidence threshold (0.0-1.0) for showing suggestions. Higher = fewer but more confident suggestions.",
895
+ "minimum": 0,
896
+ "maximum": 1,
897
+ "default": 0.7
898
+ },
899
+ "mandatory": {
900
+ "type": "boolean",
901
+ "description": "When true, BLOCKS prompts detected as implementation work until an increment is created via sw:increment. Overrides the LLM mandatory decision. Default: true (enforced).",
902
+ "default": true
903
+ }
904
+ },
905
+ "additionalProperties": false
906
+ }
907
+ },
908
+ "additionalProperties": true,
909
+ "examples": [
910
+ {
911
+ "plugins": {
912
+ "enabled": [
913
+ "specweave-github"
914
+ ],
915
+ "settings": {
916
+ "specweave-github": {
917
+ "repo": "owner/repo",
918
+ "auto_create_issue": true,
919
+ "auto_update_progress": true,
920
+ "auto_close_issue": true,
921
+ "sync_frequency": "every-task",
922
+ "default_labels": [
923
+ "specweave",
924
+ "increment"
925
+ ],
926
+ "milestone": "v1.0.0"
927
+ }
928
+ }
929
+ },
930
+ "project": {
931
+ "name": "my-project",
932
+ "version": "1.0.0",
933
+ "description": "My SpecWeave project"
934
+ },
935
+ "adapters": {
936
+ "default": "claude"
937
+ }
938
+ },
939
+ {
940
+ "plugins": {
941
+ "enabled": [
942
+ "specweave-github",
943
+ "specweave-frontend-stack",
944
+ "specweave-backend-stack"
945
+ ],
946
+ "settings": {
947
+ "specweave-github": {
948
+ "repo": "myorg/myapp",
949
+ "auto_create_issue": true,
950
+ "sync_frequency": "every-task"
951
+ },
952
+ "specweave-frontend-stack": {
953
+ "framework": "react",
954
+ "typescript": true,
955
+ "styling": "tailwind"
956
+ },
957
+ "specweave-backend-stack": {
958
+ "language": "typescript",
959
+ "framework": "express",
960
+ "database": "postgresql"
961
+ }
962
+ }
963
+ },
964
+ "project": {
965
+ "name": "full-stack-app",
966
+ "version": "0.1.0"
967
+ }
968
+ },
969
+ {
970
+ "language": "ru",
971
+ "translation": {
972
+ "enabled": true,
973
+ "method": "in-session",
974
+ "autoTranslateInternalDocs": true,
975
+ "autoTranslateLivingDocs": true,
976
+ "keepFrameworkTerms": true,
977
+ "keepTechnicalTerms": true,
978
+ "translateCodeComments": true,
979
+ "translateVariableNames": false,
980
+ "filesAlwaysInEnglish": [
981
+ "spec.md",
982
+ "plan.md",
983
+ "tasks.md",
984
+ "tests.md",
985
+ "docs/internal/**/*.md"
986
+ ],
987
+ "translationModel": "haiku"
988
+ },
989
+ "plugins": {
990
+ "enabled": []
991
+ },
992
+ "project": {
993
+ "name": "russian-project",
994
+ "version": "1.0.0"
995
+ }
996
+ },
997
+ {
998
+ "project": {
999
+ "name": "enterprise-project",
1000
+ "version": "2.0.0"
1001
+ },
1002
+ "limits": {
1003
+ "activeIncrements": 1
1004
+ },
1005
+ "plugins": {
1006
+ "enabled": [
1007
+ "specweave-github"
1008
+ ]
1009
+ }
1010
+ },
1011
+ {
1012
+ "project": {
1013
+ "name": "multi-project-example",
1014
+ "version": "1.0.0",
1015
+ "description": "Multi-project enterprise setup"
1016
+ },
1017
+ "multiProject": {
1018
+ "enabled": true,
1019
+ "projects": [
1020
+ {
1021
+ "id": "web-app",
1022
+ "name": "Web Application",
1023
+ "description": "Customer-facing web application",
1024
+ "techStack": ["React", "TypeScript", "Node.js", "PostgreSQL"],
1025
+ "team": "Frontend Team",
1026
+ "contacts": {
1027
+ "lead": "lead@example.com",
1028
+ "pm": "pm@example.com"
1029
+ },
1030
+ "syncProfiles": ["web-app-github"]
1031
+ },
1032
+ {
1033
+ "id": "mobile-app",
1034
+ "name": "Mobile Application",
1035
+ "description": "iOS and Android mobile apps",
1036
+ "techStack": ["React Native", "TypeScript", "Firebase"],
1037
+ "team": "Mobile Team",
1038
+ "syncProfiles": ["mobile-jira"]
1039
+ },
1040
+ {
1041
+ "id": "platform-infra",
1042
+ "name": "Platform Infrastructure",
1043
+ "description": "DevOps and infrastructure management",
1044
+ "techStack": ["Terraform", "Kubernetes", "Python"],
1045
+ "team": "Platform Engineering",
1046
+ "syncProfiles": ["platform-ado"]
1047
+ }
1048
+ ]
1049
+ },
1050
+ "brownfield": {
1051
+ "importHistory": [
1052
+ {
1053
+ "source": "notion",
1054
+ "workspace": "acme-corp",
1055
+ "importedAt": "2025-11-06T10:30:00Z",
1056
+ "project": "web-app",
1057
+ "filesImported": 47,
1058
+ "destination": ".specweave/docs/internal/projects/web-app/legacy/notion/"
1059
+ }
1060
+ ]
1061
+ },
1062
+ "plugins": {
1063
+ "enabled": ["specweave-github"]
1064
+ }
1065
+ },
1066
+ {
1067
+ "project": {
1068
+ "name": "docs-preview-example",
1069
+ "version": "1.0.0",
1070
+ "description": "Project with documentation preview configured"
1071
+ },
1072
+ "documentation": {
1073
+ "preview": {
1074
+ "enabled": true,
1075
+ "autoInstall": false,
1076
+ "port": 3015,
1077
+ "openBrowser": true,
1078
+ "theme": "default",
1079
+ "excludeFolders": ["legacy", "node_modules", "_backlog"]
1080
+ }
1081
+ },
1082
+ "plugins": {
1083
+ "enabled": ["specweave-github", "specweave-frontend"]
1084
+ }
1085
+ },
1086
+ {
1087
+ "project": {
1088
+ "name": "cross-project-example",
1089
+ "version": "1.0.0",
1090
+ "description": "Cross-project targeting with projectMappings (v0.33.0+)"
1091
+ },
1092
+ "projectMappings": {
1093
+ "frontend-app": {
1094
+ "github": {
1095
+ "owner": "myorg",
1096
+ "repo": "frontend-app"
1097
+ },
1098
+ "jira": {
1099
+ "project": "FE",
1100
+ "board": "web-team"
1101
+ }
1102
+ },
1103
+ "backend-api": {
1104
+ "github": {
1105
+ "owner": "myorg",
1106
+ "repo": "backend-api"
1107
+ },
1108
+ "jira": {
1109
+ "project": "BE",
1110
+ "board": "api-team"
1111
+ }
1112
+ },
1113
+ "security-compliance": {
1114
+ "jira": {
1115
+ "project": "SECURITY"
1116
+ }
1117
+ },
1118
+ "infrastructure": {
1119
+ "ado": {
1120
+ "project": "platform",
1121
+ "areaPath": "infrastructure/security"
1122
+ }
1123
+ }
1124
+ },
1125
+ "plugins": {
1126
+ "enabled": ["specweave-github", "specweave-jira"]
1127
+ }
1128
+ }
1129
+ ]
1130
+ }