specweave 0.30.6 → 0.30.8

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 (69) hide show
  1. package/dist/plugins/specweave-ado/lib/ado-profile-resolver.d.ts +9 -3
  2. package/dist/plugins/specweave-ado/lib/ado-profile-resolver.d.ts.map +1 -1
  3. package/dist/plugins/specweave-ado/lib/ado-profile-resolver.js +13 -6
  4. package/dist/plugins/specweave-ado/lib/ado-profile-resolver.js.map +1 -1
  5. package/dist/src/cli/helpers/init/external-import-grouping.js +1 -1
  6. package/dist/src/cli/helpers/init/external-import-grouping.js.map +1 -1
  7. package/dist/src/cli/helpers/init/sync-profile-helpers.d.ts.map +1 -1
  8. package/dist/src/cli/helpers/init/sync-profile-helpers.js +3 -2
  9. package/dist/src/cli/helpers/init/sync-profile-helpers.js.map +1 -1
  10. package/dist/src/cli/helpers/issue-tracker/ado.js +2 -2
  11. package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
  12. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  13. package/dist/src/cli/helpers/issue-tracker/index.js +6 -5
  14. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  15. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js +15 -10
  16. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js.map +1 -1
  17. package/dist/src/cli/workers/clone-worker.js +55 -0
  18. package/dist/src/cli/workers/clone-worker.js.map +1 -1
  19. package/dist/src/cli/workers/living-docs-worker.js +7 -0
  20. package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
  21. package/dist/src/config/types.d.ts +2 -2
  22. package/dist/src/core/config/types.d.ts +15 -1
  23. package/dist/src/core/config/types.d.ts.map +1 -1
  24. package/dist/src/core/config/types.js.map +1 -1
  25. package/dist/src/core/living-docs/discovery.d.ts +9 -0
  26. package/dist/src/core/living-docs/discovery.d.ts.map +1 -1
  27. package/dist/src/core/living-docs/discovery.js +204 -3
  28. package/dist/src/core/living-docs/discovery.js.map +1 -1
  29. package/dist/src/core/living-docs/foundation-builder.d.ts.map +1 -1
  30. package/dist/src/core/living-docs/foundation-builder.js +149 -34
  31. package/dist/src/core/living-docs/foundation-builder.js.map +1 -1
  32. package/dist/src/core/living-docs/living-docs-sync.d.ts +3 -3
  33. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  34. package/dist/src/core/living-docs/living-docs-sync.js +35 -20
  35. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  36. package/dist/src/core/living-docs/suggestions-generator.d.ts +42 -0
  37. package/dist/src/core/living-docs/suggestions-generator.d.ts.map +1 -1
  38. package/dist/src/core/living-docs/suggestions-generator.js +219 -1
  39. package/dist/src/core/living-docs/suggestions-generator.js.map +1 -1
  40. package/dist/src/core/living-docs/umbrella-detector.d.ts +94 -0
  41. package/dist/src/core/living-docs/umbrella-detector.d.ts.map +1 -0
  42. package/dist/src/core/living-docs/umbrella-detector.js +484 -0
  43. package/dist/src/core/living-docs/umbrella-detector.js.map +1 -0
  44. package/dist/src/core/living-docs/workitem-matcher.d.ts +4 -0
  45. package/dist/src/core/living-docs/workitem-matcher.d.ts.map +1 -1
  46. package/dist/src/core/living-docs/workitem-matcher.js +513 -2
  47. package/dist/src/core/living-docs/workitem-matcher.js.map +1 -1
  48. package/dist/src/core/types/config.d.ts +41 -0
  49. package/dist/src/core/types/config.d.ts.map +1 -1
  50. package/dist/src/core/types/config.js.map +1 -1
  51. package/dist/src/core/types/sync-profile.d.ts +279 -2
  52. package/dist/src/core/types/sync-profile.d.ts.map +1 -1
  53. package/dist/src/core/types/sync-profile.js +163 -0
  54. package/dist/src/core/types/sync-profile.js.map +1 -1
  55. package/dist/src/importers/item-converter.d.ts +56 -1
  56. package/dist/src/importers/item-converter.d.ts.map +1 -1
  57. package/dist/src/importers/item-converter.js +217 -64
  58. package/dist/src/importers/item-converter.js.map +1 -1
  59. package/dist/src/init/compliance/types.d.ts +1 -1
  60. package/dist/src/living-docs/epic-id-allocator.d.ts +1 -1
  61. package/dist/src/living-docs/epic-id-allocator.js +1 -1
  62. package/package.json +1 -1
  63. package/plugins/specweave-ado/commands/specweave-ado-close-workitem.md +5 -5
  64. package/plugins/specweave-ado/commands/specweave-ado-create-workitem.md +4 -4
  65. package/plugins/specweave-ado/commands/specweave-ado-sync.md +5 -5
  66. package/plugins/specweave-ado/lib/ado-profile-resolver.js +5 -3
  67. package/plugins/specweave-ado/lib/ado-profile-resolver.ts +16 -6
  68. package/plugins/specweave-ado/lib/ado-project-detector.ts +2 -2
  69. package/src/templates/config.json.template +1 -1
@@ -102,7 +102,7 @@ export declare class EpicIdAllocator {
102
102
  * Create an Epic ID Allocator for a specific project
103
103
  *
104
104
  * @param projectRoot - Root directory of the SpecWeave project
105
- * @param projectId - Project ID (e.g., "olysense", "parent"). Required for per-project epics.
105
+ * @param projectId - Project ID (e.g., "acme", "parent"). Required for per-project epics.
106
106
  * @param options - Optional configuration
107
107
  */
108
108
  constructor(projectRoot: string, projectId: string, options?: EpicIdAllocatorOptions);
@@ -40,7 +40,7 @@ export class EpicIdAllocator {
40
40
  * Create an Epic ID Allocator for a specific project
41
41
  *
42
42
  * @param projectRoot - Root directory of the SpecWeave project
43
- * @param projectId - Project ID (e.g., "olysense", "parent"). Required for per-project epics.
43
+ * @param projectId - Project ID (e.g., "acme", "parent"). Required for per-project epics.
44
44
  * @param options - Optional configuration
45
45
  */
46
46
  constructor(projectRoot, projectId, options) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specweave",
3
- "version": "0.30.6",
3
+ "version": "0.30.8",
4
4
  "description": "Spec-driven development framework for Claude Code. AI-native workflow with living documentation, intelligent agents, and multilingual support (9 languages). Enterprise-grade traceability with permanent specs and temporary increments.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -165,9 +165,9 @@ Checking permissions...
165
165
  canUpdateStatus: true
166
166
 
167
167
  Resolving ADO profile...
168
- Using: ado-nova-x-sandbox (from increment)
169
- Organization: nova-systems
170
- Project: Nova X Sandbox
168
+ Using: ado-my-project (from increment)
169
+ Organization: acme-corp
170
+ Project: My Project
171
171
 
172
172
  Validating completion...
173
173
  Tasks: 10/10 complete
@@ -176,13 +176,13 @@ Closing work item...
176
176
 
177
177
  ✅ Closed ADO Epic #12345
178
178
 
179
- Profile: ado-nova-x-sandbox
179
+ Profile: ado-my-project
180
180
  Increment: 0005-payment-integration
181
181
  Status: 100% complete (10/10 tasks)
182
182
  Duration: 3 days
183
183
 
184
184
  Summary posted to ADO work item
185
- URL: https://dev.azure.com/nova-systems/Nova%20X%20Sandbox/_workitems/edit/12345
185
+ URL: https://dev.azure.com/acme-corp/My%20Project/_workitems/edit/12345
186
186
  ```
187
187
 
188
188
  ### Permission Denied
@@ -149,15 +149,15 @@ Claude: Checking ADO permissions...
149
149
  ✓ canUpdateExternalItems: true
150
150
 
151
151
  Resolving ADO profile...
152
- ✓ Using profile: ado-nova-x-sandbox (from increment)
153
- ✓ Organization: nova-systems
154
- ✓ Project: Nova X Sandbox
152
+ ✓ Using profile: ado-my-project (from increment)
153
+ ✓ Organization: acme-corp
154
+ ✓ Project: My Project
155
155
 
156
156
  Creating work item...
157
157
  [Invokes ADO Manager Agent]
158
158
 
159
159
  ✅ Created ADO Epic #12345
160
- URL: https://dev.azure.com/nova-systems/Nova%20X%20Sandbox/_workitems/edit/12345
160
+ URL: https://dev.azure.com/acme-corp/My%20Project/_workitems/edit/12345
161
161
 
162
162
  # If permission denied:
163
163
  Claude: Checking ADO permissions...
@@ -192,9 +192,9 @@ Checking permissions...
192
192
  canUpdateExternalItems: true
193
193
 
194
194
  Resolving ADO profile...
195
- Using: ado-nova-x-sandbox (from increment)
196
- Organization: nova-systems
197
- Project: Nova X Sandbox
195
+ Using: ado-my-project (from increment)
196
+ Organization: acme-corp
197
+ Project: My Project
198
198
 
199
199
  Syncing...
200
200
 
@@ -210,8 +210,8 @@ TO ADO:
210
210
  Updated completion field: 60%
211
211
 
212
212
  Sync Complete!
213
- Profile: ado-nova-x-sandbox
214
- Work Item: https://dev.azure.com/nova-systems/Nova%20X%20Sandbox/_workitems/edit/12345
213
+ Profile: ado-my-project
214
+ Work Item: https://dev.azure.com/acme-corp/My%20Project/_workitems/edit/12345
215
215
  ```
216
216
 
217
217
  ### Permission Denied
@@ -11,7 +11,8 @@ class AdoProfileResolver {
11
11
  *
12
12
  * Priority:
13
13
  * 1. Increment's metadata.json -> external_sync.ado.profile
14
- * 2. Config.json -> sync.activeProfile
14
+ * 2. Config.json -> sync.defaultProfile (v0.31.0+)
15
+ * 3. Config.json -> sync.activeProfile (legacy fallback)
15
16
  *
16
17
  * @param incrementId - Increment ID (e.g., "0093-my-feature")
17
18
  * @returns Profile resolution result
@@ -26,11 +27,12 @@ class AdoProfileResolver {
26
27
  };
27
28
  }
28
29
  const incrementProfile = await this.getIncrementProfile(incrementId);
29
- const profileName = incrementProfile || config.sync?.activeProfile;
30
+ const globalDefaultProfile = config.sync?.defaultProfile ?? config.sync?.activeProfile;
31
+ const profileName = incrementProfile || globalDefaultProfile;
30
32
  if (!profileName) {
31
33
  return {
32
34
  success: false,
33
- error: "No ADO profile configured. Set sync.activeProfile in config.json or external_sync.ado.profile in increment metadata.",
35
+ error: "No ADO profile configured. Set sync.defaultProfile in config.json or external_sync.ado.profile in increment metadata.",
34
36
  incrementId
35
37
  };
36
38
  }
@@ -4,10 +4,15 @@
4
4
  * Resolves the correct ADO profile to use for sync operations.
5
5
  * Priority:
6
6
  * 1. Increment's stored profile (metadata.json -> external_sync.ado.profile)
7
- * 2. Global activeProfile (config.json -> sync.activeProfile)
7
+ * 2. Global defaultProfile (config.json -> sync.defaultProfile)
8
+ * 3. Legacy: Global activeProfile (config.json -> sync.activeProfile)
8
9
  *
9
10
  * This allows each increment to sync to its designated ADO project
10
- * without requiring manual activeProfile switching.
11
+ * without requiring manual profile switching.
12
+ *
13
+ * NOTE (v0.31.0): Renamed from "activeProfile" to "defaultProfile" for clarity.
14
+ * The default profile is a FALLBACK, not a constraint. Bulk operations
15
+ * iterate ALL profiles.
11
16
  *
12
17
  * Usage:
13
18
  * ```typescript
@@ -105,6 +110,9 @@ interface ConfigProfile {
105
110
  * Sync config from config.json
106
111
  */
107
112
  interface SyncConfig {
113
+ /** @since v0.31.0 - preferred */
114
+ defaultProfile?: string;
115
+ /** @deprecated Use defaultProfile */
108
116
  activeProfile?: string;
109
117
  profiles?: Record<string, ConfigProfile>;
110
118
  }
@@ -135,7 +143,8 @@ export class AdoProfileResolver {
135
143
  *
136
144
  * Priority:
137
145
  * 1. Increment's metadata.json -> external_sync.ado.profile
138
- * 2. Config.json -> sync.activeProfile
146
+ * 2. Config.json -> sync.defaultProfile (v0.31.0+)
147
+ * 3. Config.json -> sync.activeProfile (legacy fallback)
139
148
  *
140
149
  * @param incrementId - Increment ID (e.g., "0093-my-feature")
141
150
  * @returns Profile resolution result
@@ -154,13 +163,14 @@ export class AdoProfileResolver {
154
163
  // Try to get increment-specific profile first
155
164
  const incrementProfile = await this.getIncrementProfile(incrementId);
156
165
 
157
- // Determine which profile to use
158
- const profileName = incrementProfile || config.sync?.activeProfile;
166
+ // Determine which profile to use (defaultProfile preferred over activeProfile)
167
+ const globalDefaultProfile = config.sync?.defaultProfile ?? config.sync?.activeProfile;
168
+ const profileName = incrementProfile || globalDefaultProfile;
159
169
 
160
170
  if (!profileName) {
161
171
  return {
162
172
  success: false,
163
- error: 'No ADO profile configured. Set sync.activeProfile in config.json or external_sync.ado.profile in increment metadata.',
173
+ error: 'No ADO profile configured. Set sync.defaultProfile in config.json or external_sync.ado.profile in increment metadata.',
164
174
  incrementId,
165
175
  };
166
176
  }
@@ -461,8 +461,8 @@ export async function createProjectFolders(
461
461
  case 'project-per-team':
462
462
  // Create folder for each project
463
463
  // CRITICAL FIX (2025-12-01): Use normalizeToProjectId() for consistent folder names
464
- // Bug: Using raw project name created "Nova X Sandbox" folder while external-import.ts
465
- // created "nova-x-sandbox", causing duplicate folders for the same ADO project
464
+ // Bug: Using raw project name created "My Project" folder while external-import.ts
465
+ // created "my-project", causing duplicate folders for the same ADO project
466
466
  for (const project of projects) {
467
467
  const normalizedName = normalizeToProjectId(project);
468
468
  const projectPath = path.join(specsPath, normalizedName);
@@ -7,7 +7,7 @@
7
7
  "provider": "github",
8
8
  "includeStatus": true,
9
9
  "autoApplyLabels": true,
10
- "activeProfile": "main",
10
+ "defaultProfile": "main",
11
11
 
12
12
  "settings": {
13
13
  "canUpsertInternalItems": false,