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.
- package/.claude-plugin/marketplace.json +2 -2
- package/README.md +12 -1
- package/bin/specweave.js +25 -7
- package/dist/plugins/specweave/lib/integrations/github/github-client-v2.js +2 -2
- package/dist/plugins/specweave/lib/integrations/github/github-client-v2.js.map +1 -1
- package/dist/src/cli/commands/auto-status.d.ts +0 -10
- package/dist/src/cli/commands/auto-status.d.ts.map +1 -1
- package/dist/src/cli/commands/auto-status.js +3 -2
- package/dist/src/cli/commands/auto-status.js.map +1 -1
- package/dist/src/cli/commands/auto.d.ts +0 -17
- package/dist/src/cli/commands/auto.d.ts.map +1 -1
- package/dist/src/cli/commands/auto.js +8 -14
- package/dist/src/cli/commands/auto.js.map +1 -1
- package/dist/src/cli/commands/get.d.ts +4 -0
- package/dist/src/cli/commands/get.d.ts.map +1 -1
- package/dist/src/cli/commands/get.js +15 -33
- package/dist/src/cli/commands/get.js.map +1 -1
- package/dist/src/cli/commands/qa.js +2 -2
- package/dist/src/cli/commands/qa.js.map +1 -1
- package/dist/src/cli/commands/save.js +1 -1
- package/dist/src/cli/commands/save.js.map +1 -1
- package/dist/src/cli/commands/sync-progress.d.ts +0 -10
- package/dist/src/cli/commands/sync-progress.d.ts.map +1 -1
- package/dist/src/cli/commands/sync-progress.js +21 -27
- package/dist/src/cli/commands/sync-progress.js.map +1 -1
- package/dist/src/cli/commands/task.js +1 -1
- package/dist/src/cli/commands/task.js.map +1 -1
- package/dist/src/cli/commands/update.js +1 -1
- package/dist/src/cli/commands/update.js.map +1 -1
- package/dist/src/cli/helpers/get/register-repo.d.ts +1 -11
- package/dist/src/cli/helpers/get/register-repo.d.ts.map +1 -1
- package/dist/src/cli/helpers/get/register-repo.js +6 -85
- package/dist/src/cli/helpers/get/register-repo.js.map +1 -1
- package/dist/src/cli/helpers/get/source-parser.d.ts +1 -1
- package/dist/src/cli/helpers/get/source-parser.d.ts.map +1 -1
- package/dist/src/cli/helpers/get/source-parser.js +4 -4
- package/dist/src/cli/helpers/get/source-parser.js.map +1 -1
- package/dist/src/cli/helpers/init/path-utils.d.ts +1 -1
- package/dist/src/cli/helpers/init/path-utils.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/path-utils.js +44 -2
- package/dist/src/cli/helpers/init/path-utils.js.map +1 -1
- package/dist/src/cli/helpers/init/types.d.ts +1 -0
- package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
- package/dist/src/core/ac-test-validator-cli.js +1 -1
- package/dist/src/core/ac-test-validator-cli.js.map +1 -1
- package/dist/src/core/config/types.d.ts +3 -1
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/doctor/checkers/increments-checker.js +2 -2
- package/dist/src/core/doctor/checkers/increments-checker.js.map +1 -1
- package/dist/src/core/hooks/handlers/hook-router.d.ts.map +1 -1
- package/dist/src/core/hooks/handlers/hook-router.js +5 -7
- package/dist/src/core/hooks/handlers/hook-router.js.map +1 -1
- package/dist/src/core/hooks/handlers/stop.d.ts.map +1 -1
- package/dist/src/core/hooks/handlers/stop.js +17 -14
- package/dist/src/core/hooks/handlers/stop.js.map +1 -1
- package/dist/src/core/hooks/handlers/utils.d.ts.map +1 -1
- package/dist/src/core/hooks/handlers/utils.js +7 -15
- package/dist/src/core/hooks/handlers/utils.js.map +1 -1
- package/dist/src/core/increment/duplicate-detector.d.ts +0 -8
- package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -1
- package/dist/src/core/increment/duplicate-detector.js +29 -13
- package/dist/src/core/increment/duplicate-detector.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts +0 -6
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +12 -7
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/increment/increment-utils.d.ts +6 -6
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
- package/dist/src/core/increment/increment-utils.js +26 -27
- package/dist/src/core/increment/increment-utils.js.map +1 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +20 -7
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/number-reservation.d.ts +16 -0
- package/dist/src/core/increment/number-reservation.d.ts.map +1 -0
- package/dist/src/core/increment/number-reservation.js +125 -0
- package/dist/src/core/increment/number-reservation.js.map +1 -0
- package/dist/src/core/increment/template-creator.d.ts.map +1 -1
- package/dist/src/core/increment/template-creator.js +11 -43
- package/dist/src/core/increment/template-creator.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +3 -3
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-consistency-validator.js +1 -1
- package/dist/src/core/living-docs/feature-consistency-validator.js.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js +2 -2
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +3 -3
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/qa/qa-runner.d.ts +0 -6
- package/dist/src/core/qa/qa-runner.d.ts.map +1 -1
- package/dist/src/core/qa/qa-runner.js +8 -10
- package/dist/src/core/qa/qa-runner.js.map +1 -1
- package/dist/src/core/session/handoff-all.d.ts +2 -2
- package/dist/src/core/session/handoff-all.d.ts.map +1 -1
- package/dist/src/core/session/handoff-all.js +5 -3
- package/dist/src/core/session/handoff-all.js.map +1 -1
- package/dist/src/core/session/handoff-list.d.ts +0 -19
- package/dist/src/core/session/handoff-list.d.ts.map +1 -1
- package/dist/src/core/session/handoff-list.js +7 -4
- package/dist/src/core/session/handoff-list.js.map +1 -1
- package/dist/src/core/session/handoff-remote.d.ts +0 -19
- package/dist/src/core/session/handoff-remote.d.ts.map +1 -1
- package/dist/src/core/session/handoff-remote.js +3 -3
- package/dist/src/core/session/handoff-remote.js.map +1 -1
- package/dist/src/core/session/nested-repos.d.ts.map +1 -1
- package/dist/src/core/session/nested-repos.js +7 -1
- package/dist/src/core/session/nested-repos.js.map +1 -1
- package/dist/src/core/specs/spec-metadata-manager.js +1 -1
- package/dist/src/core/specs/spec-metadata-manager.js.map +1 -1
- package/dist/src/core/specs/spec-parser.js +1 -1
- package/dist/src/core/specs/spec-parser.js.map +1 -1
- package/dist/src/core/tasks/resolve-increment.d.ts.map +1 -1
- package/dist/src/core/tasks/resolve-increment.js +3 -2
- package/dist/src/core/tasks/resolve-increment.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +2 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/core/workspace/adoption.d.ts +21 -0
- package/dist/src/core/workspace/adoption.d.ts.map +1 -0
- package/dist/src/core/workspace/adoption.js +187 -0
- package/dist/src/core/workspace/adoption.js.map +1 -0
- package/dist/src/core/workspace/context.d.ts +21 -0
- package/dist/src/core/workspace/context.d.ts.map +1 -0
- package/dist/src/core/workspace/context.js +105 -0
- package/dist/src/core/workspace/context.js.map +1 -0
- package/dist/src/importers/item-converter.js +1 -1
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/sync/github-reconciler.js +2 -2
- package/dist/src/sync/github-reconciler.js.map +1 -1
- package/dist/src/utils/external-tool-drift-detector.js +1 -1
- package/dist/src/utils/external-tool-drift-detector.js.map +1 -1
- package/dist/src/utils/feature-id-collision.js +1 -1
- package/dist/src/utils/feature-id-collision.js.map +1 -1
- package/dist/src/utils/find-project-root.d.ts.map +1 -1
- package/dist/src/utils/find-project-root.js +16 -36
- package/dist/src/utils/find-project-root.js.map +1 -1
- package/dist/src/utils/increment-id-validator.d.ts +27 -67
- package/dist/src/utils/increment-id-validator.d.ts.map +1 -1
- package/dist/src/utils/increment-id-validator.js +57 -106
- package/dist/src/utils/increment-id-validator.js.map +1 -1
- package/dist/src/utils/resolve-increment-id.d.ts +0 -22
- package/dist/src/utils/resolve-increment-id.d.ts.map +1 -1
- package/dist/src/utils/resolve-increment-id.js +17 -41
- package/dist/src/utils/resolve-increment-id.js.map +1 -1
- package/package.json +2 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/lib/integrations/github/github-client-v2.js +2 -2
- package/plugins/specweave/lib/integrations/github/github-client-v2.ts +2 -2
- package/src/core/schemas/specweave-config.schema.json +1130 -0
- package/src/core/schemas/sync.schema.json +687 -0
- package/src/core/schemas/workspace.schema.json +209 -0
- 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
|
+
}
|