specweave 1.0.464 → 1.0.466

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 (109) hide show
  1. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator-cli.d.ts +16 -0
  2. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js +139 -0
  3. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js.map +1 -0
  4. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator.d.ts +111 -0
  5. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator.js +304 -0
  6. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator.js.map +1 -0
  7. package/dist/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
  8. package/dist/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +359 -0
  9. package/dist/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
  10. package/dist/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +121 -0
  11. package/dist/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +273 -0
  12. package/dist/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
  13. package/dist/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +72 -0
  14. package/dist/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +237 -0
  15. package/dist/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
  16. package/dist/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
  17. package/dist/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +281 -0
  18. package/dist/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
  19. package/dist/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +278 -0
  20. package/dist/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +925 -0
  21. package/dist/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
  22. package/dist/plugins/specweave/lib/vendor/core/increment/status-auto-transition.d.ts +113 -0
  23. package/dist/plugins/specweave/lib/vendor/core/increment/status-auto-transition.js +317 -0
  24. package/dist/plugins/specweave/lib/vendor/core/increment/status-auto-transition.js.map +1 -0
  25. package/dist/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +442 -0
  26. package/dist/plugins/specweave/lib/vendor/core/types/increment-metadata.js +246 -0
  27. package/dist/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
  28. package/dist/plugins/specweave/lib/vendor/core/universal-auto-create.d.ts +64 -0
  29. package/dist/plugins/specweave/lib/vendor/core/universal-auto-create.js +228 -0
  30. package/dist/plugins/specweave/lib/vendor/core/universal-auto-create.js.map +1 -0
  31. package/dist/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
  32. package/dist/plugins/specweave/lib/vendor/generators/spec/task-parser.js +300 -0
  33. package/dist/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
  34. package/dist/plugins/specweave/lib/vendor/sync/config.d.ts +73 -0
  35. package/dist/plugins/specweave/lib/vendor/sync/config.js +132 -0
  36. package/dist/plugins/specweave/lib/vendor/sync/config.js.map +1 -0
  37. package/dist/plugins/specweave/lib/vendor/sync/github-reconciler.d.ts +163 -0
  38. package/dist/plugins/specweave/lib/vendor/sync/github-reconciler.js +898 -0
  39. package/dist/plugins/specweave/lib/vendor/sync/github-reconciler.js.map +1 -0
  40. package/dist/plugins/specweave/lib/vendor/sync/provider-router.d.ts +86 -0
  41. package/dist/plugins/specweave/lib/vendor/sync/provider-router.js +147 -0
  42. package/dist/plugins/specweave/lib/vendor/sync/provider-router.js.map +1 -0
  43. package/dist/plugins/specweave/lib/vendor/sync/status-mapper.d.ts +120 -0
  44. package/dist/plugins/specweave/lib/vendor/sync/status-mapper.js +164 -0
  45. package/dist/plugins/specweave/lib/vendor/sync/status-mapper.js.map +1 -0
  46. package/dist/plugins/specweave/lib/vendor/utils/auth-helpers.d.ts +151 -0
  47. package/dist/plugins/specweave/lib/vendor/utils/auth-helpers.js +359 -0
  48. package/dist/plugins/specweave/lib/vendor/utils/auth-helpers.js.map +1 -0
  49. package/dist/plugins/specweave/lib/vendor/utils/chalk-fallback.d.ts +38 -0
  50. package/dist/plugins/specweave/lib/vendor/utils/chalk-fallback.js +118 -0
  51. package/dist/plugins/specweave/lib/vendor/utils/chalk-fallback.js.map +1 -0
  52. package/dist/plugins/specweave/lib/vendor/utils/clean-env.d.ts +47 -0
  53. package/dist/plugins/specweave/lib/vendor/utils/clean-env.js +63 -0
  54. package/dist/plugins/specweave/lib/vendor/utils/clean-env.js.map +1 -0
  55. package/dist/plugins/specweave/lib/vendor/utils/credential-masker.d.ts +118 -0
  56. package/dist/plugins/specweave/lib/vendor/utils/credential-masker.js +275 -0
  57. package/dist/plugins/specweave/lib/vendor/utils/credential-masker.js.map +1 -0
  58. package/dist/plugins/specweave/lib/vendor/utils/execFileNoThrow.d.ts +99 -0
  59. package/dist/plugins/specweave/lib/vendor/utils/execFileNoThrow.js +149 -0
  60. package/dist/plugins/specweave/lib/vendor/utils/execFileNoThrow.js.map +1 -0
  61. package/dist/plugins/specweave/lib/vendor/utils/feature-id-derivation.d.ts +63 -0
  62. package/dist/plugins/specweave/lib/vendor/utils/feature-id-derivation.js +85 -0
  63. package/dist/plugins/specweave/lib/vendor/utils/feature-id-derivation.js.map +1 -0
  64. package/dist/plugins/specweave/lib/vendor/utils/fs-native.d.ts +219 -0
  65. package/dist/plugins/specweave/lib/vendor/utils/fs-native.js +397 -0
  66. package/dist/plugins/specweave/lib/vendor/utils/fs-native.js.map +1 -0
  67. package/dist/plugins/specweave/lib/vendor/utils/logger.d.ts +56 -0
  68. package/dist/plugins/specweave/lib/vendor/utils/logger.js +123 -0
  69. package/dist/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
  70. package/dist/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
  71. package/dist/plugins/specweave/lib/vendor/utils/translation.js +414 -0
  72. package/dist/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
  73. package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js +1 -1
  74. package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js.map +1 -1
  75. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js +1 -1
  76. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js.map +1 -1
  77. package/dist/plugins/specweave-github/lib/github-ac-checkbox-sync.js +2 -2
  78. package/dist/plugins/specweave-github/lib/github-ac-checkbox-sync.js.map +1 -1
  79. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -1
  80. package/dist/plugins/specweave-github/lib/github-feature-sync.js +13 -4
  81. package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -1
  82. package/dist/plugins/specweave-jira/lib/jira-ac-checkbox-sync.js +1 -1
  83. package/dist/plugins/specweave-jira/lib/jira-ac-checkbox-sync.js.map +1 -1
  84. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js +1 -1
  85. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js.map +1 -1
  86. package/dist/src/sync/spec-to-living-docs-sync.js +1 -1
  87. package/dist/src/sync/spec-to-living-docs-sync.js.map +1 -1
  88. package/package.json +1 -1
  89. package/plugins/specweave/lib/vendor/utils/auth-helpers.d.ts +151 -0
  90. package/plugins/specweave/lib/vendor/utils/auth-helpers.js +359 -0
  91. package/plugins/specweave/lib/vendor/utils/auth-helpers.js.map +1 -0
  92. package/plugins/specweave/skills/team-lead/SKILL.md +150 -56
  93. package/plugins/specweave/skills/team-lead/agents/backend.md +13 -9
  94. package/plugins/specweave/skills/team-lead/agents/database.md +13 -9
  95. package/plugins/specweave/skills/team-lead/agents/frontend.md +12 -8
  96. package/plugins/specweave/skills/team-lead/agents/security.md +13 -9
  97. package/plugins/specweave/skills/team-lead/agents/testing.md +12 -8
  98. package/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js +1 -1
  99. package/plugins/specweave-ado/lib/ado-ac-checkbox-sync.ts +1 -1
  100. package/plugins/specweave-ado/lib/ado-spec-sync.js +1 -1
  101. package/plugins/specweave-ado/lib/ado-spec-sync.ts +1 -1
  102. package/plugins/specweave-github/lib/github-ac-checkbox-sync.js +1 -1
  103. package/plugins/specweave-github/lib/github-ac-checkbox-sync.ts +2 -2
  104. package/plugins/specweave-github/lib/github-feature-sync.js +11 -3
  105. package/plugins/specweave-github/lib/github-feature-sync.ts +13 -4
  106. package/plugins/specweave-jira/lib/jira-ac-checkbox-sync.js +1 -1
  107. package/plugins/specweave-jira/lib/jira-ac-checkbox-sync.ts +1 -1
  108. package/plugins/specweave-jira/lib/jira-spec-sync.js +1 -1
  109. package/plugins/specweave-jira/lib/jira-spec-sync.ts +1 -1
@@ -0,0 +1,442 @@
1
+ /**
2
+ * Increment Metadata Types
3
+ *
4
+ * Defines the schema for increment metadata tracking (status, type, timestamps).
5
+ * Part of increment 0007: Smart Status Management
6
+ */
7
+ /**
8
+ * Increment status enum
9
+ * Tracks the lifecycle state of an increment
10
+ */
11
+ export declare enum IncrementStatus {
12
+ /** Planning phase - spec/plan/tasks being created (does NOT count towards WIP limits) */
13
+ PLANNING = "planning",
14
+ /** Currently being worked on */
15
+ ACTIVE = "active",
16
+ /** Planned but not ready to start yet (does NOT count towards WIP limits) */
17
+ BACKLOG = "backlog",
18
+ /** Temporarily stopped (blocked by external dependency, deprioritized) */
19
+ PAUSED = "paused",
20
+ /**
21
+ * All tasks complete, awaiting user review (v0.28.63+)
22
+ *
23
+ * CRITICAL: This is a gating status that prevents auto-completion bugs.
24
+ * - Auto-transitions to READY_FOR_REVIEW when all tasks completed
25
+ * - User MUST explicitly run /sw:done to move to COMPLETED
26
+ * - /sw:next will prompt for confirmation before closure
27
+ *
28
+ * Prevents the bug where status becomes "completed" without:
29
+ * 1. ACs being checked in spec.md
30
+ * 2. User approval
31
+ */
32
+ READY_FOR_REVIEW = "ready_for_review",
33
+ /** All tasks complete AND user approved - increment finished */
34
+ COMPLETED = "completed",
35
+ /** Work abandoned (requirements changed, obsolete, etc.) */
36
+ ABANDONED = "abandoned"
37
+ }
38
+ /**
39
+ * Increment type enum
40
+ * Determines rules and limits applied to the increment
41
+ */
42
+ export declare enum IncrementType {
43
+ /** Critical production fix (bypasses all limits) */
44
+ HOTFIX = "hotfix",
45
+ /** Standard feature development (limit: 2 active) */
46
+ FEATURE = "feature",
47
+ /** Production bug fix with SRE investigation (unlimited, urgent) */
48
+ BUG = "bug",
49
+ /** Change request from stakeholders (limit: 2 active) */
50
+ CHANGE_REQUEST = "change-request",
51
+ /** Code improvement (limit: 1 active) */
52
+ REFACTOR = "refactor",
53
+ /** POC/spike work (unlimited, auto-abandon after 14 days) */
54
+ EXPERIMENT = "experiment"
55
+ }
56
+ /**
57
+ * Increment metadata schema
58
+ * Stored in .specweave/increments/{id}/metadata.json
59
+ */
60
+ export interface IncrementMetadata {
61
+ /** Increment ID (e.g., "0007-smart-increment-discipline") */
62
+ id: string;
63
+ /** Current status */
64
+ status: IncrementStatus;
65
+ /** Increment type */
66
+ type: IncrementType;
67
+ /** Creation timestamp (ISO 8601) */
68
+ created: string;
69
+ /** Last activity timestamp (ISO 8601) */
70
+ lastActivity: string;
71
+ /** Testing mode for this increment (defaults to global config) */
72
+ testMode?: 'TDD' | 'test-after' | 'manual' | 'none';
73
+ /** Coverage target percentage (0-100, 0 = no tracking, defaults to global config) */
74
+ coverageTarget?: number;
75
+ /** Reason for moving to backlog (only if status = backlog) */
76
+ backlogReason?: string;
77
+ /** Timestamp when moved to backlog (ISO 8601) */
78
+ backlogAt?: string;
79
+ /** Reason for pausing (only if status = paused) */
80
+ pausedReason?: string;
81
+ /** Timestamp when paused (ISO 8601) */
82
+ pausedAt?: string;
83
+ /** Reason for abandoning (only if status = abandoned) */
84
+ abandonedReason?: string;
85
+ /** Timestamp when abandoned (ISO 8601) */
86
+ abandonedAt?: string;
87
+ /**
88
+ * Timestamp when moved to ready_for_review (ISO 8601)
89
+ * Set automatically when all tasks are completed
90
+ * (v0.28.63+)
91
+ */
92
+ readyForReviewAt?: string;
93
+ /**
94
+ * Timestamp when user approved completion (ISO 8601)
95
+ * Set only via explicit /sw:done command
96
+ * (v0.28.63+)
97
+ */
98
+ approvedAt?: string;
99
+ }
100
+ /**
101
+ * Increment metadata with additional computed fields
102
+ * Used for rich status displays
103
+ */
104
+ export interface IncrementMetadataExtended extends IncrementMetadata {
105
+ /** Progress percentage (0-100) */
106
+ progress?: number;
107
+ /** Number of completed tasks */
108
+ completedTasks?: number;
109
+ /** Total number of tasks */
110
+ totalTasks?: number;
111
+ /** Age in days since creation */
112
+ ageInDays?: number;
113
+ /** Days since paused (if paused) */
114
+ daysPaused?: number;
115
+ }
116
+ /**
117
+ * Valid status transitions
118
+ * Enforces increment lifecycle rules
119
+ *
120
+ * CRITICAL (v0.28.63+): ACTIVE cannot directly transition to COMPLETED!
121
+ * Must go through READY_FOR_REVIEW first, which requires explicit user approval.
122
+ * This prevents the auto-completion bug where increments are marked "completed"
123
+ * without ACs being checked or user confirmation.
124
+ */
125
+ export declare const VALID_TRANSITIONS: Record<IncrementStatus, IncrementStatus[]>;
126
+ /**
127
+ * Compute the shortest valid transition path from `from` to `to`.
128
+ *
129
+ * Uses BFS over the VALID_TRANSITIONS graph.
130
+ * Returns the sequence of intermediate + final states (excluding the starting state).
131
+ * Returns null if no valid path exists.
132
+ *
133
+ * Example: computeTransitionPath(PLANNING, COMPLETED)
134
+ * => [ACTIVE, READY_FOR_REVIEW, COMPLETED]
135
+ */
136
+ export declare function computeTransitionPath(from: IncrementStatus, to: IncrementStatus): IncrementStatus[] | null;
137
+ /**
138
+ * Type-based limits
139
+ * Maximum active increments per type
140
+ *
141
+ * null = unlimited (no limit enforcement)
142
+ * User can configure per-project in .specweave/config.json
143
+ */
144
+ export declare const TYPE_LIMITS: Record<IncrementType, number | null>;
145
+ /**
146
+ * Staleness thresholds (days)
147
+ * When to warn about stale increments
148
+ */
149
+ export declare const STALENESS_THRESHOLDS: {
150
+ /** Warn if paused for more than this many days */
151
+ PAUSED: number;
152
+ /** Warn if active for more than this many days */
153
+ ACTIVE: number;
154
+ /** Auto-abandon experiments after this many days */
155
+ EXPERIMENT: number;
156
+ };
157
+ /**
158
+ * Default metadata for new increments
159
+ *
160
+ * NOTE: New increments start in PLANNING status by default.
161
+ * They auto-transition to ACTIVE when tasks.md is created or first task starts.
162
+ */
163
+ export declare function createDefaultMetadata(id: string, type?: IncrementType): IncrementMetadata;
164
+ /**
165
+ * Check if status transition is valid
166
+ */
167
+ export declare function isValidTransition(from: IncrementStatus, to: IncrementStatus): boolean;
168
+ /**
169
+ * Check if increment is stale (paused too long or active too long)
170
+ */
171
+ export declare function isStale(metadata: IncrementMetadata): boolean;
172
+ /**
173
+ * Check if increment should be auto-abandoned (experiments only)
174
+ */
175
+ export declare function shouldAutoAbandon(metadata: IncrementMetadata): boolean;
176
+ /**
177
+ * Statuses that count toward WIP (Work In Progress) limits
178
+ *
179
+ * ACTIVE: Currently executing tasks, consumes team capacity
180
+ * PAUSED: Temporarily blocked but still holding resources/context
181
+ * READY_FOR_REVIEW: Tasks done, awaiting approval (still blocks capacity)
182
+ *
183
+ * Statuses that do NOT count:
184
+ * - PLANNING: Lightweight spec/planning work, parallel-safe
185
+ * - BACKLOG: Not started yet
186
+ * - COMPLETED: Already done (user approved)
187
+ * - ABANDONED: Cancelled
188
+ */
189
+ export declare const WIP_COUNTED_STATUSES: IncrementStatus[];
190
+ /**
191
+ * Check if increment status counts toward WIP (Work In Progress) limits
192
+ */
193
+ export declare function countsTowardWipLimit(status: IncrementStatus): boolean;
194
+ /**
195
+ * Validate if a status transition is allowed
196
+ * @throws Error if transition is invalid
197
+ */
198
+ export declare function validateTransition(from: IncrementStatus, to: IncrementStatus): void;
199
+ /**
200
+ * Project scope for a multi-project user story
201
+ * Defines what portion of the work belongs to each project
202
+ */
203
+ export interface MultiProjectScope {
204
+ /** SpecWeave project ID (e.g., "FE", "BE", "Shared") */
205
+ id: string;
206
+ /** Description of work scope for this project */
207
+ scope: string;
208
+ /** Keywords for this project's portion (for auto-classification) */
209
+ keywords?: string[];
210
+ /** Estimated effort percentage (0-100) */
211
+ effortPercentage?: number;
212
+ }
213
+ /**
214
+ * Cross-project dependency
215
+ * Defines dependencies between projects within a user story
216
+ */
217
+ export interface CrossProjectDependency {
218
+ /** Project that depends on another */
219
+ from: string;
220
+ /** Project being depended upon */
221
+ to: string;
222
+ /** Description of the dependency */
223
+ reason: string;
224
+ /** Type of dependency */
225
+ type?: 'blocking' | 'soft' | 'interface';
226
+ }
227
+ /**
228
+ * Multi-project user story configuration
229
+ * Used when a single user story spans multiple SpecWeave projects
230
+ */
231
+ export interface MultiProjectUserStory {
232
+ /** List of projects this user story touches */
233
+ projects: MultiProjectScope[];
234
+ /** Dependencies between projects (optional) */
235
+ dependencies?: CrossProjectDependency[];
236
+ /** Primary project (receives the main spec, others get derived specs) */
237
+ primaryProject?: string;
238
+ /** How to handle sync - create linked issues in each project's external tool */
239
+ syncStrategy?: 'linked' | 'primary-only' | 'all';
240
+ }
241
+ /**
242
+ * External container context for 2-level directory structure
243
+ * Used for JIRA boards / ADO area paths mapping
244
+ */
245
+ export interface ExternalContainerContext {
246
+ /** Container type (e.g., "jira-project", "ado-project") */
247
+ type: 'jira-project' | 'ado-project' | 'github-org';
248
+ /** External container ID (e.g., "CORE" for JIRA, "MyProduct" for ADO) */
249
+ containerId: string;
250
+ /** Display name */
251
+ containerName: string;
252
+ /** Board ID (JIRA only) */
253
+ boardId?: number;
254
+ /** Board name (JIRA only) */
255
+ boardName?: string;
256
+ /** Area path (ADO only) */
257
+ areaPath?: string;
258
+ }
259
+ /**
260
+ * External reference for a single US in a single external tool
261
+ * @since v0.33.0
262
+ */
263
+ export interface USExternalRef {
264
+ /** External tool type */
265
+ provider: 'github' | 'jira' | 'ado';
266
+ /** Issue/work item number */
267
+ issueNumber: number | string;
268
+ /** Issue URL */
269
+ url: string;
270
+ /** Target project/repo for this US (from projectMappings) */
271
+ targetProject: string;
272
+ /** Last sync timestamp */
273
+ lastSynced?: string;
274
+ }
275
+ /**
276
+ * Per-US external references map
277
+ * Maps US-ID → provider → reference
278
+ * @since v0.33.0
279
+ */
280
+ export interface USExternalRefsMap {
281
+ [usId: string]: {
282
+ github?: USExternalRef;
283
+ jira?: USExternalRef;
284
+ ado?: USExternalRef;
285
+ };
286
+ }
287
+ /**
288
+ * How the sync target was determined
289
+ * Used for debugging and audit trails
290
+ */
291
+ export type SyncTargetDerivation = 'user-selection' | 'project-mapping' | 'default-profile' | 'first-profile-fallback' | 'auto-detected';
292
+ /**
293
+ * External tool sync target for an increment
294
+ *
295
+ * Explicitly specifies which external tool profile this increment syncs with.
296
+ * Stored in metadata.json to provide audit trail and deterministic sync behavior.
297
+ *
298
+ * @since v1.0.31 (ADR-0211)
299
+ *
300
+ * @example
301
+ * ```json
302
+ * {
303
+ * "syncTarget": {
304
+ * "profileId": "github-frontend",
305
+ * "provider": "github",
306
+ * "derivedFrom": "project-mapping",
307
+ * "setAt": "2025-12-18T10:30:00Z"
308
+ * }
309
+ * }
310
+ * ```
311
+ */
312
+ export interface SyncTarget {
313
+ /**
314
+ * Profile ID from config.sync.profiles
315
+ * This is the key that links to the full profile configuration
316
+ *
317
+ * @example "github-frontend", "jira-backend", "ado-main"
318
+ */
319
+ profileId: string;
320
+ /**
321
+ * Provider type for quick filtering without loading full config
322
+ */
323
+ provider: 'github' | 'jira' | 'ado';
324
+ /**
325
+ * How this target was determined (for debugging/audit)
326
+ */
327
+ derivedFrom: SyncTargetDerivation;
328
+ /**
329
+ * Timestamp when target was set (ISO 8601)
330
+ */
331
+ setAt: string;
332
+ /**
333
+ * Optional: Source project ID that led to this target
334
+ * Useful when derivedFrom is 'project-mapping'
335
+ */
336
+ sourceProjectId?: string;
337
+ }
338
+ /**
339
+ * Validation result for external tool configuration
340
+ *
341
+ * @since v1.0.31
342
+ */
343
+ export interface ExternalToolValidationResult {
344
+ /** Whether the configuration is valid */
345
+ valid: boolean;
346
+ /** Resolved sync target (if valid) */
347
+ syncTarget?: SyncTarget;
348
+ /** List of validation errors */
349
+ errors: string[];
350
+ /** List of validation warnings (non-blocking) */
351
+ warnings: string[];
352
+ /** Suggested fixes for errors */
353
+ suggestions?: string[];
354
+ }
355
+ /**
356
+ * Extended increment metadata with multi-project support (v0.29.0+)
357
+ *
358
+ * NOTE (v0.29.0): featureId field was REMOVED
359
+ * Feature ID is derived from increment number: 0081 → FS-081
360
+ * Use deriveFeatureId() from src/utils/feature-id-derivation.ts
361
+ * See ADR-0140 for rationale
362
+ */
363
+ export interface IncrementMetadataV2 extends IncrementMetadata {
364
+ /** Single project ID (backward compatible) */
365
+ projectId?: string;
366
+ /** Multi-project configuration (v0.29.0+, overrides projectId if set) */
367
+ multiProject?: MultiProjectUserStory;
368
+ /** External container context for 2-level directory structure */
369
+ externalContainer?: ExternalContainerContext;
370
+ /** Epic ID if part of an epic */
371
+ epicId?: string;
372
+ /**
373
+ * Per-US external references (v0.33.0+)
374
+ * Replaces the single external_ref for cross-project increments
375
+ * Maps: US-001 → { github: {...}, jira: {...} }
376
+ */
377
+ externalRefs?: USExternalRefsMap;
378
+ /**
379
+ * External tool sync target (v1.0.31+ - ADR-0211)
380
+ *
381
+ * Explicitly specifies which external tool profile this increment syncs with.
382
+ * Provides deterministic sync behavior and audit trail.
383
+ *
384
+ * Resolution priority:
385
+ * 1. This field (explicit)
386
+ * 2. **Project**: field in spec.md → config.projectMappings
387
+ * 3. config.sync.defaultProfile (fallback)
388
+ *
389
+ * @example
390
+ * ```json
391
+ * {
392
+ * "syncTarget": {
393
+ * "profileId": "github-frontend",
394
+ * "provider": "github",
395
+ * "derivedFrom": "project-mapping",
396
+ * "setAt": "2025-12-18T10:30:00Z"
397
+ * }
398
+ * }
399
+ * ```
400
+ */
401
+ syncTarget?: SyncTarget;
402
+ /**
403
+ * Pull request references for pr-based push strategy (v1.0.437+)
404
+ *
405
+ * Tracks branch names and PR URLs created during increment closure.
406
+ * Single-repo: array with one entry. Multi-repo/umbrella: one entry per touched repo.
407
+ *
408
+ * @example
409
+ * ```json
410
+ * {
411
+ * "prRefs": [{
412
+ * "branch": "sw/0520-pr-based-closure",
413
+ * "prNumber": 42,
414
+ * "prUrl": "https://github.com/org/repo/pull/42",
415
+ * "state": "open",
416
+ * "createdAt": "2026-03-12T10:00:00Z"
417
+ * }]
418
+ * }
419
+ * ```
420
+ */
421
+ prRefs?: PrRef[];
422
+ /** When true, skip living docs sync for this increment (per-increment override) */
423
+ skipLivingDocsSync?: boolean;
424
+ }
425
+ /**
426
+ * Pull request reference for a single repository (v1.0.437+)
427
+ */
428
+ export interface PrRef {
429
+ /** Branch name (e.g., 'sw/0016-checkout-flow') */
430
+ branch: string;
431
+ /** PR number */
432
+ prNumber?: number;
433
+ /** PR URL */
434
+ prUrl?: string;
435
+ /** Repository slug (owner/repo) for multi-repo. Omit for single-repo. */
436
+ repoSlug?: string;
437
+ /** PR state */
438
+ state?: 'open' | 'merged' | 'closed';
439
+ /** When the PR was created */
440
+ createdAt?: string;
441
+ }
442
+ //# sourceMappingURL=increment-metadata.d.ts.map
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Increment Metadata Types
3
+ *
4
+ * Defines the schema for increment metadata tracking (status, type, timestamps).
5
+ * Part of increment 0007: Smart Status Management
6
+ */
7
+ /**
8
+ * Increment status enum
9
+ * Tracks the lifecycle state of an increment
10
+ */
11
+ export var IncrementStatus;
12
+ (function (IncrementStatus) {
13
+ /** Planning phase - spec/plan/tasks being created (does NOT count towards WIP limits) */
14
+ IncrementStatus["PLANNING"] = "planning";
15
+ /** Currently being worked on */
16
+ IncrementStatus["ACTIVE"] = "active";
17
+ /** Planned but not ready to start yet (does NOT count towards WIP limits) */
18
+ IncrementStatus["BACKLOG"] = "backlog";
19
+ /** Temporarily stopped (blocked by external dependency, deprioritized) */
20
+ IncrementStatus["PAUSED"] = "paused";
21
+ /**
22
+ * All tasks complete, awaiting user review (v0.28.63+)
23
+ *
24
+ * CRITICAL: This is a gating status that prevents auto-completion bugs.
25
+ * - Auto-transitions to READY_FOR_REVIEW when all tasks completed
26
+ * - User MUST explicitly run /sw:done to move to COMPLETED
27
+ * - /sw:next will prompt for confirmation before closure
28
+ *
29
+ * Prevents the bug where status becomes "completed" without:
30
+ * 1. ACs being checked in spec.md
31
+ * 2. User approval
32
+ */
33
+ IncrementStatus["READY_FOR_REVIEW"] = "ready_for_review";
34
+ /** All tasks complete AND user approved - increment finished */
35
+ IncrementStatus["COMPLETED"] = "completed";
36
+ /** Work abandoned (requirements changed, obsolete, etc.) */
37
+ IncrementStatus["ABANDONED"] = "abandoned";
38
+ })(IncrementStatus || (IncrementStatus = {}));
39
+ /**
40
+ * Increment type enum
41
+ * Determines rules and limits applied to the increment
42
+ */
43
+ export var IncrementType;
44
+ (function (IncrementType) {
45
+ /** Critical production fix (bypasses all limits) */
46
+ IncrementType["HOTFIX"] = "hotfix";
47
+ /** Standard feature development (limit: 2 active) */
48
+ IncrementType["FEATURE"] = "feature";
49
+ /** Production bug fix with SRE investigation (unlimited, urgent) */
50
+ IncrementType["BUG"] = "bug";
51
+ /** Change request from stakeholders (limit: 2 active) */
52
+ IncrementType["CHANGE_REQUEST"] = "change-request";
53
+ /** Code improvement (limit: 1 active) */
54
+ IncrementType["REFACTOR"] = "refactor";
55
+ /** POC/spike work (unlimited, auto-abandon after 14 days) */
56
+ IncrementType["EXPERIMENT"] = "experiment";
57
+ })(IncrementType || (IncrementType = {}));
58
+ /**
59
+ * Valid status transitions
60
+ * Enforces increment lifecycle rules
61
+ *
62
+ * CRITICAL (v0.28.63+): ACTIVE cannot directly transition to COMPLETED!
63
+ * Must go through READY_FOR_REVIEW first, which requires explicit user approval.
64
+ * This prevents the auto-completion bug where increments are marked "completed"
65
+ * without ACs being checked or user confirmation.
66
+ */
67
+ export const VALID_TRANSITIONS = {
68
+ [IncrementStatus.PLANNING]: [
69
+ IncrementStatus.ACTIVE, // Move to active when tasks start
70
+ IncrementStatus.BACKLOG, // Move to backlog if deprioritized
71
+ IncrementStatus.ABANDONED // Cancel planning
72
+ ],
73
+ [IncrementStatus.ACTIVE]: [
74
+ IncrementStatus.BACKLOG,
75
+ IncrementStatus.PAUSED,
76
+ IncrementStatus.READY_FOR_REVIEW, // All tasks done → awaiting review
77
+ IncrementStatus.ABANDONED
78
+ // NOTE: COMPLETED intentionally NOT allowed! Must go through READY_FOR_REVIEW
79
+ ],
80
+ [IncrementStatus.BACKLOG]: [
81
+ IncrementStatus.PLANNING, // Resume planning
82
+ IncrementStatus.ACTIVE,
83
+ IncrementStatus.ABANDONED
84
+ ],
85
+ [IncrementStatus.PAUSED]: [
86
+ IncrementStatus.ACTIVE,
87
+ IncrementStatus.READY_FOR_REVIEW, // Can mark done while paused
88
+ IncrementStatus.ABANDONED
89
+ ],
90
+ [IncrementStatus.READY_FOR_REVIEW]: [
91
+ IncrementStatus.COMPLETED, // ONLY via explicit /sw:done with user approval
92
+ IncrementStatus.ACTIVE, // Reopen if more work needed
93
+ IncrementStatus.ABANDONED // Cancel if requirements changed
94
+ ],
95
+ [IncrementStatus.COMPLETED]: [
96
+ // Allow reopening completed increments when issues discovered
97
+ IncrementStatus.ACTIVE, // Reopen for fixes
98
+ IncrementStatus.ABANDONED // Mark as failed (rare)
99
+ ],
100
+ [IncrementStatus.ABANDONED]: [
101
+ IncrementStatus.ACTIVE // Can un-abandon if needed (rare)
102
+ ]
103
+ };
104
+ /**
105
+ * Compute the shortest valid transition path from `from` to `to`.
106
+ *
107
+ * Uses BFS over the VALID_TRANSITIONS graph.
108
+ * Returns the sequence of intermediate + final states (excluding the starting state).
109
+ * Returns null if no valid path exists.
110
+ *
111
+ * Example: computeTransitionPath(PLANNING, COMPLETED)
112
+ * => [ACTIVE, READY_FOR_REVIEW, COMPLETED]
113
+ */
114
+ export function computeTransitionPath(from, to) {
115
+ if (from === to)
116
+ return [];
117
+ const queue = [
118
+ { status: from, path: [] }
119
+ ];
120
+ const visited = new Set([from]);
121
+ while (queue.length > 0) {
122
+ const current = queue.shift();
123
+ const neighbors = VALID_TRANSITIONS[current.status] ?? [];
124
+ for (const next of neighbors) {
125
+ if (visited.has(next))
126
+ continue;
127
+ const newPath = [...current.path, next];
128
+ if (next === to)
129
+ return newPath;
130
+ visited.add(next);
131
+ queue.push({ status: next, path: newPath });
132
+ }
133
+ }
134
+ return null;
135
+ }
136
+ /**
137
+ * Type-based limits
138
+ * Maximum active increments per type
139
+ *
140
+ * null = unlimited (no limit enforcement)
141
+ * User can configure per-project in .specweave/config.json
142
+ */
143
+ export const TYPE_LIMITS = {
144
+ [IncrementType.HOTFIX]: null, // Unlimited (emergency work)
145
+ [IncrementType.FEATURE]: 2, // Max 2 active (context switching cost)
146
+ [IncrementType.BUG]: null, // Unlimited (production issues)
147
+ [IncrementType.CHANGE_REQUEST]: 2, // Max 2 active (stakeholder-driven)
148
+ [IncrementType.REFACTOR]: 1, // Max 1 active (needs focus)
149
+ [IncrementType.EXPERIMENT]: null // Unlimited (exploratory work)
150
+ };
151
+ /**
152
+ * Staleness thresholds (days)
153
+ * When to warn about stale increments
154
+ */
155
+ export const STALENESS_THRESHOLDS = {
156
+ /** Warn if paused for more than this many days */
157
+ PAUSED: 7,
158
+ /** Warn if active for more than this many days */
159
+ ACTIVE: 30,
160
+ /** Auto-abandon experiments after this many days */
161
+ EXPERIMENT: 14
162
+ };
163
+ /**
164
+ * Default metadata for new increments
165
+ *
166
+ * NOTE: New increments start in PLANNING status by default.
167
+ * They auto-transition to ACTIVE when tasks.md is created or first task starts.
168
+ */
169
+ export function createDefaultMetadata(id, type = IncrementType.FEATURE) {
170
+ const now = new Date().toISOString();
171
+ return {
172
+ id,
173
+ status: IncrementStatus.PLANNING, // Start in planning phase
174
+ type,
175
+ created: now,
176
+ lastActivity: now
177
+ };
178
+ }
179
+ /**
180
+ * Check if status transition is valid
181
+ */
182
+ export function isValidTransition(from, to) {
183
+ const allowedTransitions = VALID_TRANSITIONS[from];
184
+ return allowedTransitions.includes(to);
185
+ }
186
+ /**
187
+ * Calculate days elapsed since a given date
188
+ */
189
+ function daysSince(dateStr) {
190
+ return (Date.now() - new Date(dateStr).getTime()) / (1000 * 60 * 60 * 24);
191
+ }
192
+ /**
193
+ * Check if increment is stale (paused too long or active too long)
194
+ */
195
+ export function isStale(metadata) {
196
+ if (metadata.status === IncrementStatus.PAUSED && metadata.pausedAt) {
197
+ return daysSince(metadata.pausedAt) > STALENESS_THRESHOLDS.PAUSED;
198
+ }
199
+ if (metadata.status === IncrementStatus.ACTIVE) {
200
+ return daysSince(metadata.created) > STALENESS_THRESHOLDS.ACTIVE;
201
+ }
202
+ return false;
203
+ }
204
+ /**
205
+ * Check if increment should be auto-abandoned (experiments only)
206
+ */
207
+ export function shouldAutoAbandon(metadata) {
208
+ return metadata.type === IncrementType.EXPERIMENT &&
209
+ daysSince(metadata.lastActivity) > STALENESS_THRESHOLDS.EXPERIMENT;
210
+ }
211
+ /**
212
+ * Statuses that count toward WIP (Work In Progress) limits
213
+ *
214
+ * ACTIVE: Currently executing tasks, consumes team capacity
215
+ * PAUSED: Temporarily blocked but still holding resources/context
216
+ * READY_FOR_REVIEW: Tasks done, awaiting approval (still blocks capacity)
217
+ *
218
+ * Statuses that do NOT count:
219
+ * - PLANNING: Lightweight spec/planning work, parallel-safe
220
+ * - BACKLOG: Not started yet
221
+ * - COMPLETED: Already done (user approved)
222
+ * - ABANDONED: Cancelled
223
+ */
224
+ export const WIP_COUNTED_STATUSES = [
225
+ IncrementStatus.ACTIVE,
226
+ IncrementStatus.PAUSED, // Paused work still blocks team capacity
227
+ IncrementStatus.READY_FOR_REVIEW // Awaiting user approval, still in progress
228
+ ];
229
+ /**
230
+ * Check if increment status counts toward WIP (Work In Progress) limits
231
+ */
232
+ export function countsTowardWipLimit(status) {
233
+ return WIP_COUNTED_STATUSES.includes(status);
234
+ }
235
+ /**
236
+ * Validate if a status transition is allowed
237
+ * @throws Error if transition is invalid
238
+ */
239
+ export function validateTransition(from, to) {
240
+ if (!isValidTransition(from, to)) {
241
+ const validTransitions = VALID_TRANSITIONS[from];
242
+ throw new Error(`Invalid transition: ${from} → ${to}.\n` +
243
+ `Valid transitions from ${from}: ${validTransitions.join(', ')}`);
244
+ }
245
+ }
246
+ //# sourceMappingURL=increment-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"increment-metadata.js","sourceRoot":"","sources":["../../../../src/core/types/increment-metadata.ts"],"names":[],"mappings":"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"}