specweave 0.28.68 → 0.29.1

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 (318) hide show
  1. package/CLAUDE.md +3 -2
  2. package/README.md +19 -2
  3. package/dist/src/cli/commands/discrepancies.d.ts +89 -0
  4. package/dist/src/cli/commands/discrepancies.d.ts.map +1 -0
  5. package/dist/src/cli/commands/discrepancies.js +385 -0
  6. package/dist/src/cli/commands/discrepancies.js.map +1 -0
  7. package/dist/src/cli/commands/notifications.d.ts +70 -0
  8. package/dist/src/cli/commands/notifications.d.ts.map +1 -0
  9. package/dist/src/cli/commands/notifications.js +236 -0
  10. package/dist/src/cli/commands/notifications.js.map +1 -0
  11. package/dist/src/cli/commands/sync-logs.d.ts +54 -0
  12. package/dist/src/cli/commands/sync-logs.d.ts.map +1 -0
  13. package/dist/src/cli/commands/sync-logs.js +240 -0
  14. package/dist/src/cli/commands/sync-logs.js.map +1 -0
  15. package/dist/src/cli/commands/sync-monitor.d.ts +42 -0
  16. package/dist/src/cli/commands/sync-monitor.d.ts.map +1 -0
  17. package/dist/src/cli/commands/sync-monitor.js +191 -0
  18. package/dist/src/cli/commands/sync-monitor.js.map +1 -0
  19. package/dist/src/cli/helpers/init/brownfield-analysis.d.ts +45 -0
  20. package/dist/src/cli/helpers/init/brownfield-analysis.d.ts.map +1 -0
  21. package/dist/src/cli/helpers/init/brownfield-analysis.js +431 -0
  22. package/dist/src/cli/helpers/init/brownfield-analysis.js.map +1 -0
  23. package/dist/src/cli/helpers/init/index.d.ts +1 -0
  24. package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
  25. package/dist/src/cli/helpers/init/index.js +2 -0
  26. package/dist/src/cli/helpers/init/index.js.map +1 -1
  27. package/dist/src/cli/workers/brownfield-worker.d.ts +66 -0
  28. package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -0
  29. package/dist/src/cli/workers/brownfield-worker.js +417 -0
  30. package/dist/src/cli/workers/brownfield-worker.js.map +1 -0
  31. package/dist/src/core/background/brownfield-launcher.d.ts +86 -0
  32. package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -0
  33. package/dist/src/core/background/brownfield-launcher.js +295 -0
  34. package/dist/src/core/background/brownfield-launcher.js.map +1 -0
  35. package/dist/src/core/background/index.d.ts +2 -0
  36. package/dist/src/core/background/index.d.ts.map +1 -1
  37. package/dist/src/core/background/index.js +2 -0
  38. package/dist/src/core/background/index.js.map +1 -1
  39. package/dist/src/core/background/types.d.ts +23 -2
  40. package/dist/src/core/background/types.d.ts.map +1 -1
  41. package/dist/src/core/config/index.d.ts +1 -0
  42. package/dist/src/core/config/index.d.ts.map +1 -1
  43. package/dist/src/core/config/index.js +1 -0
  44. package/dist/src/core/config/index.js.map +1 -1
  45. package/dist/src/core/config/types.d.ts +6 -0
  46. package/dist/src/core/config/types.d.ts.map +1 -1
  47. package/dist/src/core/config/types.js.map +1 -1
  48. package/dist/src/core/dashboard/dashboard-data.d.ts +156 -0
  49. package/dist/src/core/dashboard/dashboard-data.d.ts.map +1 -0
  50. package/dist/src/core/dashboard/dashboard-data.js +191 -0
  51. package/dist/src/core/dashboard/dashboard-data.js.map +1 -0
  52. package/dist/src/core/dashboard/index.d.ts +9 -0
  53. package/dist/src/core/dashboard/index.d.ts.map +1 -0
  54. package/dist/src/core/dashboard/index.js +9 -0
  55. package/dist/src/core/dashboard/index.js.map +1 -0
  56. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts +77 -0
  57. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts.map +1 -0
  58. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js +286 -0
  59. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js.map +1 -0
  60. package/dist/src/core/discrepancy/analyzers/index.d.ts +8 -0
  61. package/dist/src/core/discrepancy/analyzers/index.d.ts.map +1 -0
  62. package/dist/src/core/discrepancy/analyzers/index.js +8 -0
  63. package/dist/src/core/discrepancy/analyzers/index.js.map +1 -0
  64. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts +96 -0
  65. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts.map +1 -0
  66. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js +247 -0
  67. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js.map +1 -0
  68. package/dist/src/core/discrepancy/brownfield-manager.d.ts +88 -0
  69. package/dist/src/core/discrepancy/brownfield-manager.d.ts.map +1 -0
  70. package/dist/src/core/discrepancy/brownfield-manager.js +520 -0
  71. package/dist/src/core/discrepancy/brownfield-manager.js.map +1 -0
  72. package/dist/src/core/discrepancy/brownfield-types.d.ts +174 -0
  73. package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -0
  74. package/dist/src/core/discrepancy/brownfield-types.js +11 -0
  75. package/dist/src/core/discrepancy/brownfield-types.js.map +1 -0
  76. package/dist/src/core/discrepancy/detector.d.ts +92 -0
  77. package/dist/src/core/discrepancy/detector.d.ts.map +1 -0
  78. package/dist/src/core/discrepancy/detector.js +346 -0
  79. package/dist/src/core/discrepancy/detector.js.map +1 -0
  80. package/dist/src/core/discrepancy/increment-generator.d.ts +51 -0
  81. package/dist/src/core/discrepancy/increment-generator.d.ts.map +1 -0
  82. package/dist/src/core/discrepancy/increment-generator.js +234 -0
  83. package/dist/src/core/discrepancy/increment-generator.js.map +1 -0
  84. package/dist/src/core/discrepancy/index.d.ts +18 -0
  85. package/dist/src/core/discrepancy/index.d.ts.map +1 -0
  86. package/dist/src/core/discrepancy/index.js +24 -0
  87. package/dist/src/core/discrepancy/index.js.map +1 -0
  88. package/dist/src/core/discrepancy/severity-classifier.d.ts +81 -0
  89. package/dist/src/core/discrepancy/severity-classifier.d.ts.map +1 -0
  90. package/dist/src/core/discrepancy/severity-classifier.js +289 -0
  91. package/dist/src/core/discrepancy/severity-classifier.js.map +1 -0
  92. package/dist/src/core/discrepancy/spec-parser.d.ts +74 -0
  93. package/dist/src/core/discrepancy/spec-parser.d.ts.map +1 -0
  94. package/dist/src/core/discrepancy/spec-parser.js +213 -0
  95. package/dist/src/core/discrepancy/spec-parser.js.map +1 -0
  96. package/dist/src/core/discrepancy/update-recommender.d.ts +77 -0
  97. package/dist/src/core/discrepancy/update-recommender.d.ts.map +1 -0
  98. package/dist/src/core/discrepancy/update-recommender.js +323 -0
  99. package/dist/src/core/discrepancy/update-recommender.js.map +1 -0
  100. package/dist/src/core/living-docs/living-docs-sync.d.ts +13 -16
  101. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  102. package/dist/src/core/living-docs/living-docs-sync.js +31 -112
  103. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  104. package/dist/src/core/logs/index.d.ts +10 -0
  105. package/dist/src/core/logs/index.d.ts.map +1 -0
  106. package/dist/src/core/logs/index.js +10 -0
  107. package/dist/src/core/logs/index.js.map +1 -0
  108. package/dist/src/core/logs/log-aggregator.d.ts +130 -0
  109. package/dist/src/core/logs/log-aggregator.d.ts.map +1 -0
  110. package/dist/src/core/logs/log-aggregator.js +206 -0
  111. package/dist/src/core/logs/log-aggregator.js.map +1 -0
  112. package/dist/src/core/logs/log-exporter.d.ts +81 -0
  113. package/dist/src/core/logs/log-exporter.d.ts.map +1 -0
  114. package/dist/src/core/logs/log-exporter.js +141 -0
  115. package/dist/src/core/logs/log-exporter.js.map +1 -0
  116. package/dist/src/core/notifications/command-integration.d.ts +82 -0
  117. package/dist/src/core/notifications/command-integration.d.ts.map +1 -0
  118. package/dist/src/core/notifications/command-integration.js +80 -0
  119. package/dist/src/core/notifications/command-integration.js.map +1 -0
  120. package/dist/src/core/notifications/index.d.ts +12 -0
  121. package/dist/src/core/notifications/index.d.ts.map +1 -0
  122. package/dist/src/core/notifications/index.js +12 -0
  123. package/dist/src/core/notifications/index.js.map +1 -0
  124. package/dist/src/core/notifications/notification-display.d.ts +70 -0
  125. package/dist/src/core/notifications/notification-display.d.ts.map +1 -0
  126. package/dist/src/core/notifications/notification-display.js +177 -0
  127. package/dist/src/core/notifications/notification-display.js.map +1 -0
  128. package/dist/src/core/notifications/notification-manager.d.ts +126 -0
  129. package/dist/src/core/notifications/notification-manager.d.ts.map +1 -0
  130. package/dist/src/core/notifications/notification-manager.js +287 -0
  131. package/dist/src/core/notifications/notification-manager.js.map +1 -0
  132. package/dist/src/core/notifications/notification-types.d.ts +159 -0
  133. package/dist/src/core/notifications/notification-types.d.ts.map +1 -0
  134. package/dist/src/core/notifications/notification-types.js +93 -0
  135. package/dist/src/core/notifications/notification-types.js.map +1 -0
  136. package/dist/src/core/scheduler/index.d.ts +11 -0
  137. package/dist/src/core/scheduler/index.d.ts.map +1 -0
  138. package/dist/src/core/scheduler/index.js +11 -0
  139. package/dist/src/core/scheduler/index.js.map +1 -0
  140. package/dist/src/core/scheduler/job-scheduler.d.ts +179 -0
  141. package/dist/src/core/scheduler/job-scheduler.d.ts.map +1 -0
  142. package/dist/src/core/scheduler/job-scheduler.js +282 -0
  143. package/dist/src/core/scheduler/job-scheduler.js.map +1 -0
  144. package/dist/src/core/scheduler/schedule-persistence.d.ts +83 -0
  145. package/dist/src/core/scheduler/schedule-persistence.d.ts.map +1 -0
  146. package/dist/src/core/scheduler/schedule-persistence.js +180 -0
  147. package/dist/src/core/scheduler/schedule-persistence.js.map +1 -0
  148. package/dist/src/core/scheduler/scheduled-job.d.ts +188 -0
  149. package/dist/src/core/scheduler/scheduled-job.d.ts.map +1 -0
  150. package/dist/src/core/scheduler/scheduled-job.js +182 -0
  151. package/dist/src/core/scheduler/scheduled-job.js.map +1 -0
  152. package/dist/src/core/sync/permission-enforcer.d.ts +206 -0
  153. package/dist/src/core/sync/permission-enforcer.d.ts.map +1 -0
  154. package/dist/src/core/sync/permission-enforcer.js +268 -0
  155. package/dist/src/core/sync/permission-enforcer.js.map +1 -0
  156. package/dist/src/core/sync/sync-audit-logger.d.ts +217 -0
  157. package/dist/src/core/sync/sync-audit-logger.d.ts.map +1 -0
  158. package/dist/src/core/sync/sync-audit-logger.js +327 -0
  159. package/dist/src/core/sync/sync-audit-logger.js.map +1 -0
  160. package/dist/src/core/sync/sync-interceptor.d.ts +190 -0
  161. package/dist/src/core/sync/sync-interceptor.d.ts.map +1 -0
  162. package/dist/src/core/sync/sync-interceptor.js +224 -0
  163. package/dist/src/core/sync/sync-interceptor.js.map +1 -0
  164. package/dist/src/core/types/increment-metadata.d.ts +5 -2
  165. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  166. package/dist/src/core/types/sync-config.d.ts +267 -0
  167. package/dist/src/core/types/sync-config.d.ts.map +1 -0
  168. package/dist/src/core/types/sync-config.js +304 -0
  169. package/dist/src/core/types/sync-config.js.map +1 -0
  170. package/dist/src/hooks/index.d.ts +11 -0
  171. package/dist/src/hooks/index.d.ts.map +1 -0
  172. package/dist/src/hooks/index.js +11 -0
  173. package/dist/src/hooks/index.js.map +1 -0
  174. package/dist/src/hooks/platform.d.ts +125 -0
  175. package/dist/src/hooks/platform.d.ts.map +1 -0
  176. package/dist/src/hooks/platform.js +325 -0
  177. package/dist/src/hooks/platform.js.map +1 -0
  178. package/dist/src/hooks/processor.d.ts +20 -0
  179. package/dist/src/hooks/processor.d.ts.map +1 -0
  180. package/dist/src/hooks/processor.js +317 -0
  181. package/dist/src/hooks/processor.js.map +1 -0
  182. package/dist/src/hooks/scheduler-startup.d.ts +19 -0
  183. package/dist/src/hooks/scheduler-startup.d.ts.map +1 -0
  184. package/dist/src/hooks/scheduler-startup.js +92 -0
  185. package/dist/src/hooks/scheduler-startup.js.map +1 -0
  186. package/dist/src/hooks/session-start.d.ts +16 -0
  187. package/dist/src/hooks/session-start.d.ts.map +1 -0
  188. package/dist/src/hooks/session-start.js +92 -0
  189. package/dist/src/hooks/session-start.js.map +1 -0
  190. package/dist/src/importers/duplicate-detector.d.ts +13 -2
  191. package/dist/src/importers/duplicate-detector.d.ts.map +1 -1
  192. package/dist/src/importers/duplicate-detector.js +21 -2
  193. package/dist/src/importers/duplicate-detector.js.map +1 -1
  194. package/dist/src/importers/item-converter.d.ts +41 -2
  195. package/dist/src/importers/item-converter.d.ts.map +1 -1
  196. package/dist/src/importers/item-converter.js +225 -38
  197. package/dist/src/importers/item-converter.js.map +1 -1
  198. package/dist/src/living-docs/fs-id-allocator.d.ts +7 -0
  199. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  200. package/dist/src/living-docs/fs-id-allocator.js +30 -4
  201. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  202. package/dist/src/sync/ado-sync-wrapper.d.ts +137 -0
  203. package/dist/src/sync/ado-sync-wrapper.d.ts.map +1 -0
  204. package/dist/src/sync/ado-sync-wrapper.js +148 -0
  205. package/dist/src/sync/ado-sync-wrapper.js.map +1 -0
  206. package/dist/src/sync/github-sync-wrapper.d.ts +195 -0
  207. package/dist/src/sync/github-sync-wrapper.d.ts.map +1 -0
  208. package/dist/src/sync/github-sync-wrapper.js +220 -0
  209. package/dist/src/sync/github-sync-wrapper.js.map +1 -0
  210. package/dist/src/sync/jira-sync-wrapper.d.ts +155 -0
  211. package/dist/src/sync/jira-sync-wrapper.d.ts.map +1 -0
  212. package/dist/src/sync/jira-sync-wrapper.js +175 -0
  213. package/dist/src/sync/jira-sync-wrapper.js.map +1 -0
  214. package/dist/src/utils/feature-id-derivation.d.ts +58 -0
  215. package/dist/src/utils/feature-id-derivation.d.ts.map +1 -0
  216. package/dist/src/utils/feature-id-derivation.js +77 -0
  217. package/dist/src/utils/feature-id-derivation.js.map +1 -0
  218. package/package.json +3 -1
  219. package/plugins/specweave/commands/specweave-discrepancies.md +141 -0
  220. package/plugins/specweave/commands/specweave-discrepancy-to-increment.md +160 -0
  221. package/plugins/specweave/commands/specweave-jobs.md +45 -2
  222. package/plugins/specweave/commands/specweave-notifications.md +92 -0
  223. package/plugins/specweave/commands/specweave-sync-logs.md +131 -0
  224. package/plugins/specweave/commands/specweave-sync-monitor.md +57 -0
  225. package/plugins/specweave/hooks/hooks.json +3 -3
  226. package/plugins/specweave/hooks/lib/scheduler-startup.sh +72 -0
  227. package/plugins/specweave/hooks/universal/dispatcher.mjs +246 -0
  228. package/plugins/specweave/hooks/universal/session-start.cmd +16 -0
  229. package/plugins/specweave/hooks/universal/session-start.ps1 +16 -0
  230. package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +14 -5
  231. package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +5 -2
  232. package/plugins/specweave/skills/discrepancy-viewer.md +154 -0
  233. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +46 -0
  234. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +69 -0
  235. package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts +0 -26
  236. package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts.map +0 -1
  237. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js +0 -249
  238. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js.map +0 -1
  239. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +0 -28
  240. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +0 -1
  241. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +0 -156
  242. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +0 -1
  243. package/dist/src/core/sync/bidirectional-engine.d.ts +0 -119
  244. package/dist/src/core/sync/bidirectional-engine.d.ts.map +0 -1
  245. package/dist/src/core/sync/bidirectional-engine.js +0 -359
  246. package/dist/src/core/sync/bidirectional-engine.js.map +0 -1
  247. package/dist/src/core/sync/conflict-resolver.d.ts +0 -66
  248. package/dist/src/core/sync/conflict-resolver.d.ts.map +0 -1
  249. package/dist/src/core/sync/conflict-resolver.js +0 -108
  250. package/dist/src/core/sync/conflict-resolver.js.map +0 -1
  251. package/dist/src/core/sync/enhanced-content-builder.d.ts +0 -55
  252. package/dist/src/core/sync/enhanced-content-builder.d.ts.map +0 -1
  253. package/dist/src/core/sync/enhanced-content-builder.js +0 -203
  254. package/dist/src/core/sync/enhanced-content-builder.js.map +0 -1
  255. package/dist/src/core/sync/folder-mapper.d.ts +0 -71
  256. package/dist/src/core/sync/folder-mapper.d.ts.map +0 -1
  257. package/dist/src/core/sync/folder-mapper.js +0 -203
  258. package/dist/src/core/sync/folder-mapper.js.map +0 -1
  259. package/dist/src/core/sync/label-detector.d.ts +0 -66
  260. package/dist/src/core/sync/label-detector.d.ts.map +0 -1
  261. package/dist/src/core/sync/label-detector.js +0 -224
  262. package/dist/src/core/sync/label-detector.js.map +0 -1
  263. package/dist/src/core/sync/performance-optimizer.d.ts +0 -153
  264. package/dist/src/core/sync/performance-optimizer.d.ts.map +0 -1
  265. package/dist/src/core/sync/performance-optimizer.js +0 -220
  266. package/dist/src/core/sync/performance-optimizer.js.map +0 -1
  267. package/dist/src/core/sync/profile-selector.d.ts +0 -52
  268. package/dist/src/core/sync/profile-selector.d.ts.map +0 -1
  269. package/dist/src/core/sync/profile-selector.js +0 -179
  270. package/dist/src/core/sync/profile-selector.js.map +0 -1
  271. package/dist/src/core/sync/profile-validator.d.ts +0 -52
  272. package/dist/src/core/sync/profile-validator.d.ts.map +0 -1
  273. package/dist/src/core/sync/profile-validator.js +0 -170
  274. package/dist/src/core/sync/profile-validator.js.map +0 -1
  275. package/dist/src/core/sync/rate-limiter.d.ts +0 -116
  276. package/dist/src/core/sync/rate-limiter.d.ts.map +0 -1
  277. package/dist/src/core/sync/rate-limiter.js +0 -308
  278. package/dist/src/core/sync/rate-limiter.js.map +0 -1
  279. package/dist/src/core/sync/retry-handler.d.ts +0 -98
  280. package/dist/src/core/sync/retry-handler.d.ts.map +0 -1
  281. package/dist/src/core/sync/retry-handler.js +0 -196
  282. package/dist/src/core/sync/retry-handler.js.map +0 -1
  283. package/dist/src/core/sync/retry-logic.d.ts +0 -64
  284. package/dist/src/core/sync/retry-logic.d.ts.map +0 -1
  285. package/dist/src/core/sync/retry-logic.js +0 -165
  286. package/dist/src/core/sync/retry-logic.js.map +0 -1
  287. package/dist/src/core/sync/status-cache.d.ts +0 -91
  288. package/dist/src/core/sync/status-cache.d.ts.map +0 -1
  289. package/dist/src/core/sync/status-cache.js +0 -140
  290. package/dist/src/core/sync/status-cache.js.map +0 -1
  291. package/dist/src/core/sync/status-mapper.d.ts +0 -69
  292. package/dist/src/core/sync/status-mapper.d.ts.map +0 -1
  293. package/dist/src/core/sync/status-mapper.js +0 -90
  294. package/dist/src/core/sync/status-mapper.js.map +0 -1
  295. package/dist/src/core/sync/status-sync-engine.d.ts +0 -162
  296. package/dist/src/core/sync/status-sync-engine.d.ts.map +0 -1
  297. package/dist/src/core/sync/status-sync-engine.js +0 -347
  298. package/dist/src/core/sync/status-sync-engine.js.map +0 -1
  299. package/dist/src/core/sync/sync-event-logger.d.ts +0 -113
  300. package/dist/src/core/sync/sync-event-logger.d.ts.map +0 -1
  301. package/dist/src/core/sync/sync-event-logger.js +0 -141
  302. package/dist/src/core/sync/sync-event-logger.js.map +0 -1
  303. package/dist/src/core/sync/time-range-selector.d.ts +0 -48
  304. package/dist/src/core/sync/time-range-selector.d.ts.map +0 -1
  305. package/dist/src/core/sync/time-range-selector.js +0 -224
  306. package/dist/src/core/sync/time-range-selector.js.map +0 -1
  307. package/dist/src/core/sync/types.d.ts +0 -52
  308. package/dist/src/core/sync/types.d.ts.map +0 -1
  309. package/dist/src/core/sync/types.js +0 -5
  310. package/dist/src/core/sync/types.js.map +0 -1
  311. package/dist/src/core/sync/workflow-detector.d.ts +0 -95
  312. package/dist/src/core/sync/workflow-detector.d.ts.map +0 -1
  313. package/dist/src/core/sync/workflow-detector.js +0 -175
  314. package/dist/src/core/sync/workflow-detector.js.map +0 -1
  315. package/plugins/specweave-github/lib/enhanced-github-sync.js +0 -220
  316. package/plugins/specweave-github/lib/enhanced-github-sync.ts +0 -322
  317. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +0 -134
  318. package/plugins/specweave-jira/lib/enhanced-jira-sync.ts +0 -196
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Sync Interceptor
3
+ *
4
+ * Central control point for all sync operations. Wraps sync operations with
5
+ * permission checks and audit logging. Implements the interceptor pattern to
6
+ * ensure consistent enforcement across all platforms (GitHub, JIRA, ADO).
7
+ *
8
+ * Pattern:
9
+ * Request → Interceptor → Permission Check → Execute/Deny → Log → Response
10
+ *
11
+ * @module core/sync/sync-interceptor
12
+ */
13
+ import { PermissionEnforcer, SyncOperation, ItemOrigin, PermissionResult } from './permission-enforcer.js';
14
+ import { SyncAuditLogger } from './sync-audit-logger.js';
15
+ import { SyncPlatform } from '../types/sync-config.js';
16
+ import { Logger } from '../../utils/logger.js';
17
+ /**
18
+ * Interceptor result - wraps the operation result with metadata
19
+ */
20
+ export interface InterceptorResult<T> {
21
+ /**
22
+ * Whether the operation was allowed
23
+ */
24
+ allowed: boolean;
25
+ /**
26
+ * The result of the operation (null if denied or error)
27
+ */
28
+ result: T | null;
29
+ /**
30
+ * Permission check result
31
+ */
32
+ permission: PermissionResult;
33
+ /**
34
+ * Duration of the operation in milliseconds
35
+ */
36
+ durationMs: number;
37
+ /**
38
+ * Error if operation failed
39
+ */
40
+ error?: Error;
41
+ }
42
+ /**
43
+ * Sync interceptor options
44
+ */
45
+ export interface SyncInterceptorOptions {
46
+ /**
47
+ * Permission enforcer instance
48
+ */
49
+ permissionEnforcer: PermissionEnforcer;
50
+ /**
51
+ * Audit logger instance
52
+ */
53
+ auditLogger: SyncAuditLogger;
54
+ /**
55
+ * Logger instance
56
+ */
57
+ logger?: Logger;
58
+ /**
59
+ * Enable strict mode - throw on permission denial instead of returning null
60
+ * @default false
61
+ */
62
+ strictMode?: boolean;
63
+ }
64
+ /**
65
+ * Permission denied error
66
+ */
67
+ export declare class PermissionDeniedError extends Error {
68
+ readonly permission: PermissionResult;
69
+ readonly platform: SyncPlatform;
70
+ readonly operation: SyncOperation;
71
+ constructor(permission: PermissionResult, platform: SyncPlatform, operation: SyncOperation);
72
+ }
73
+ /**
74
+ * SyncInterceptor - Central control point for sync operations
75
+ *
76
+ * All sync operations must pass through this interceptor to ensure:
77
+ * 1. Permissions are checked before execution
78
+ * 2. All attempts are logged (success, denied, error)
79
+ * 3. Consistent behavior across all platforms
80
+ *
81
+ * Usage:
82
+ * ```typescript
83
+ * const result = await interceptor.intercept(
84
+ * 'github',
85
+ * 'upsert-internal',
86
+ * 'FS-001',
87
+ * 'internal',
88
+ * () => this.githubClient.createIssue(item)
89
+ * );
90
+ *
91
+ * if (result.allowed) {
92
+ * return result.result;
93
+ * } else {
94
+ * console.log(`Denied: ${result.permission.reason}`);
95
+ * }
96
+ * ```
97
+ */
98
+ export declare class SyncInterceptor {
99
+ private readonly permissionEnforcer;
100
+ private readonly auditLogger;
101
+ private readonly logger;
102
+ private readonly strictMode;
103
+ constructor(options: SyncInterceptorOptions);
104
+ /**
105
+ * Intercept a sync operation
106
+ *
107
+ * Checks permissions, executes if allowed, logs the result.
108
+ *
109
+ * @param platform - Target platform (github, jira, ado)
110
+ * @param operation - Operation type (read, update-status, upsert-internal, upsert-external)
111
+ * @param itemId - Item ID being operated on
112
+ * @param origin - Item origin (internal or external)
113
+ * @param execute - Function to execute if permitted
114
+ * @returns Interceptor result with operation outcome
115
+ */
116
+ intercept<T>(platform: SyncPlatform, operation: SyncOperation, itemId: string, origin: ItemOrigin, execute: () => Promise<T>): Promise<InterceptorResult<T>>;
117
+ /**
118
+ * Intercept with automatic origin detection
119
+ *
120
+ * Convenience method that auto-detects item origin from itemId.
121
+ * External items end with 'E' or contain '-E-'.
122
+ *
123
+ * @param platform - Target platform
124
+ * @param operation - Operation type
125
+ * @param itemId - Item ID (origin auto-detected)
126
+ * @param execute - Function to execute
127
+ */
128
+ interceptAuto<T>(platform: SyncPlatform, operation: SyncOperation, itemId: string, execute: () => Promise<T>): Promise<InterceptorResult<T>>;
129
+ /**
130
+ * Intercept a read operation (always allowed)
131
+ *
132
+ * Convenience method for read operations. Still logs for audit.
133
+ *
134
+ * @param platform - Target platform
135
+ * @param itemId - Item ID
136
+ * @param execute - Function to execute
137
+ */
138
+ interceptRead<T>(platform: SyncPlatform, itemId: string, execute: () => Promise<T>): Promise<InterceptorResult<T>>;
139
+ /**
140
+ * Intercept a status update operation
141
+ *
142
+ * @param platform - Target platform
143
+ * @param itemId - Item ID
144
+ * @param execute - Function to execute
145
+ */
146
+ interceptStatusUpdate<T>(platform: SyncPlatform, itemId: string, execute: () => Promise<T>): Promise<InterceptorResult<T>>;
147
+ /**
148
+ * Intercept an upsert operation
149
+ *
150
+ * Automatically determines operation type based on item origin.
151
+ *
152
+ * @param platform - Target platform
153
+ * @param itemId - Item ID
154
+ * @param execute - Function to execute
155
+ */
156
+ interceptUpsert<T>(platform: SyncPlatform, itemId: string, execute: () => Promise<T>): Promise<InterceptorResult<T>>;
157
+ /**
158
+ * Check if an operation would be allowed (without executing)
159
+ *
160
+ * Useful for pre-flight checks before expensive operations.
161
+ *
162
+ * @param platform - Target platform
163
+ * @param operation - Operation type
164
+ * @param itemId - Item ID
165
+ * @returns true if operation would be allowed
166
+ */
167
+ wouldAllow(platform: SyncPlatform, operation: SyncOperation, itemId: string): boolean;
168
+ /**
169
+ * Get permission summary for a platform
170
+ *
171
+ * @param platform - Target platform
172
+ * @returns Human-readable summary
173
+ */
174
+ getPermissionsSummary(): string;
175
+ /**
176
+ * Detect item origin from ID
177
+ *
178
+ * External items end with 'E' or contain '-E-'.
179
+ */
180
+ private detectOrigin;
181
+ }
182
+ /**
183
+ * Create a SyncInterceptor with default configuration
184
+ *
185
+ * @param permissionEnforcer - Permission enforcer instance
186
+ * @param specweavePath - Path to .specweave directory
187
+ * @param logger - Optional logger
188
+ */
189
+ export declare function createSyncInterceptor(permissionEnforcer: PermissionEnforcer, specweavePath: string, logger?: Logger): Promise<SyncInterceptor>;
190
+ //# sourceMappingURL=sync-interceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-interceptor.d.ts","sourceRoot":"","sources":["../../../../src/core/sync/sync-interceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Sync Interceptor
3
+ *
4
+ * Central control point for all sync operations. Wraps sync operations with
5
+ * permission checks and audit logging. Implements the interceptor pattern to
6
+ * ensure consistent enforcement across all platforms (GitHub, JIRA, ADO).
7
+ *
8
+ * Pattern:
9
+ * Request → Interceptor → Permission Check → Execute/Deny → Log → Response
10
+ *
11
+ * @module core/sync/sync-interceptor
12
+ */
13
+ import { consoleLogger } from '../../utils/logger.js';
14
+ /**
15
+ * Permission denied error
16
+ */
17
+ export class PermissionDeniedError extends Error {
18
+ constructor(permission, platform, operation) {
19
+ super(`Permission denied: ${permission.reason}`);
20
+ this.permission = permission;
21
+ this.platform = platform;
22
+ this.operation = operation;
23
+ this.name = 'PermissionDeniedError';
24
+ }
25
+ }
26
+ /**
27
+ * SyncInterceptor - Central control point for sync operations
28
+ *
29
+ * All sync operations must pass through this interceptor to ensure:
30
+ * 1. Permissions are checked before execution
31
+ * 2. All attempts are logged (success, denied, error)
32
+ * 3. Consistent behavior across all platforms
33
+ *
34
+ * Usage:
35
+ * ```typescript
36
+ * const result = await interceptor.intercept(
37
+ * 'github',
38
+ * 'upsert-internal',
39
+ * 'FS-001',
40
+ * 'internal',
41
+ * () => this.githubClient.createIssue(item)
42
+ * );
43
+ *
44
+ * if (result.allowed) {
45
+ * return result.result;
46
+ * } else {
47
+ * console.log(`Denied: ${result.permission.reason}`);
48
+ * }
49
+ * ```
50
+ */
51
+ export class SyncInterceptor {
52
+ constructor(options) {
53
+ this.permissionEnforcer = options.permissionEnforcer;
54
+ this.auditLogger = options.auditLogger;
55
+ this.logger = options.logger ?? consoleLogger;
56
+ this.strictMode = options.strictMode ?? false;
57
+ }
58
+ /**
59
+ * Intercept a sync operation
60
+ *
61
+ * Checks permissions, executes if allowed, logs the result.
62
+ *
63
+ * @param platform - Target platform (github, jira, ado)
64
+ * @param operation - Operation type (read, update-status, upsert-internal, upsert-external)
65
+ * @param itemId - Item ID being operated on
66
+ * @param origin - Item origin (internal or external)
67
+ * @param execute - Function to execute if permitted
68
+ * @returns Interceptor result with operation outcome
69
+ */
70
+ async intercept(platform, operation, itemId, origin, execute) {
71
+ const startTime = Date.now();
72
+ // Check permission
73
+ const permission = await this.permissionEnforcer.checkAndLog(platform, operation, itemId, origin);
74
+ // Handle denial
75
+ if (!permission.allowed) {
76
+ const durationMs = Date.now() - startTime;
77
+ await this.auditLogger.logDenied(platform, operation, itemId, permission.reason);
78
+ this.logger.debug(`[SyncInterceptor] Denied: ${platform}/${operation} for ${itemId} - ${permission.reason}`);
79
+ // Strict mode throws instead of returning
80
+ if (this.strictMode) {
81
+ throw new PermissionDeniedError(permission, platform, operation);
82
+ }
83
+ return {
84
+ allowed: false,
85
+ result: null,
86
+ permission,
87
+ durationMs,
88
+ };
89
+ }
90
+ // Execute the operation
91
+ try {
92
+ const result = await execute();
93
+ const durationMs = Date.now() - startTime;
94
+ await this.auditLogger.logSuccess(platform, operation, itemId, durationMs);
95
+ this.logger.debug(`[SyncInterceptor] Success: ${platform}/${operation} for ${itemId} (${durationMs}ms)`);
96
+ return {
97
+ allowed: true,
98
+ result,
99
+ permission,
100
+ durationMs,
101
+ };
102
+ }
103
+ catch (error) {
104
+ const durationMs = Date.now() - startTime;
105
+ const err = error instanceof Error ? error : new Error(String(error));
106
+ await this.auditLogger.logError(platform, operation, itemId, err);
107
+ this.logger.debug(`[SyncInterceptor] Error: ${platform}/${operation} for ${itemId} - ${err.message}`);
108
+ return {
109
+ allowed: true, // Was allowed, but failed
110
+ result: null,
111
+ permission,
112
+ durationMs,
113
+ error: err,
114
+ };
115
+ }
116
+ }
117
+ /**
118
+ * Intercept with automatic origin detection
119
+ *
120
+ * Convenience method that auto-detects item origin from itemId.
121
+ * External items end with 'E' or contain '-E-'.
122
+ *
123
+ * @param platform - Target platform
124
+ * @param operation - Operation type
125
+ * @param itemId - Item ID (origin auto-detected)
126
+ * @param execute - Function to execute
127
+ */
128
+ async interceptAuto(platform, operation, itemId, execute) {
129
+ const origin = this.detectOrigin(itemId);
130
+ return this.intercept(platform, operation, itemId, origin, execute);
131
+ }
132
+ /**
133
+ * Intercept a read operation (always allowed)
134
+ *
135
+ * Convenience method for read operations. Still logs for audit.
136
+ *
137
+ * @param platform - Target platform
138
+ * @param itemId - Item ID
139
+ * @param execute - Function to execute
140
+ */
141
+ async interceptRead(platform, itemId, execute) {
142
+ return this.intercept(platform, 'read', itemId, 'internal', execute);
143
+ }
144
+ /**
145
+ * Intercept a status update operation
146
+ *
147
+ * @param platform - Target platform
148
+ * @param itemId - Item ID
149
+ * @param execute - Function to execute
150
+ */
151
+ async interceptStatusUpdate(platform, itemId, execute) {
152
+ const origin = this.detectOrigin(itemId);
153
+ return this.intercept(platform, 'update-status', itemId, origin, execute);
154
+ }
155
+ /**
156
+ * Intercept an upsert operation
157
+ *
158
+ * Automatically determines operation type based on item origin.
159
+ *
160
+ * @param platform - Target platform
161
+ * @param itemId - Item ID
162
+ * @param execute - Function to execute
163
+ */
164
+ async interceptUpsert(platform, itemId, execute) {
165
+ const origin = this.detectOrigin(itemId);
166
+ const operation = origin === 'external' ? 'upsert-external' : 'upsert-internal';
167
+ return this.intercept(platform, operation, itemId, origin, execute);
168
+ }
169
+ /**
170
+ * Check if an operation would be allowed (without executing)
171
+ *
172
+ * Useful for pre-flight checks before expensive operations.
173
+ *
174
+ * @param platform - Target platform
175
+ * @param operation - Operation type
176
+ * @param itemId - Item ID
177
+ * @returns true if operation would be allowed
178
+ */
179
+ wouldAllow(platform, operation, itemId) {
180
+ const origin = this.detectOrigin(itemId);
181
+ const permission = this.permissionEnforcer.checkPermission(platform, operation, itemId, origin);
182
+ return permission.allowed;
183
+ }
184
+ /**
185
+ * Get permission summary for a platform
186
+ *
187
+ * @param platform - Target platform
188
+ * @returns Human-readable summary
189
+ */
190
+ getPermissionsSummary() {
191
+ return this.permissionEnforcer.getPermissionsSummary().summary;
192
+ }
193
+ /**
194
+ * Detect item origin from ID
195
+ *
196
+ * External items end with 'E' or contain '-E-'.
197
+ */
198
+ detectOrigin(itemId) {
199
+ if (itemId.endsWith('E') || itemId.includes('-E-')) {
200
+ return 'external';
201
+ }
202
+ return 'internal';
203
+ }
204
+ }
205
+ /**
206
+ * Create a SyncInterceptor with default configuration
207
+ *
208
+ * @param permissionEnforcer - Permission enforcer instance
209
+ * @param specweavePath - Path to .specweave directory
210
+ * @param logger - Optional logger
211
+ */
212
+ export async function createSyncInterceptor(permissionEnforcer, specweavePath, logger) {
213
+ const { SyncAuditLogger: AuditLoggerClass } = await import('./sync-audit-logger.js');
214
+ const auditLogger = new AuditLoggerClass({
215
+ specweavePath,
216
+ logger,
217
+ });
218
+ return new SyncInterceptor({
219
+ permissionEnforcer,
220
+ auditLogger,
221
+ logger,
222
+ });
223
+ }
224
+ //# sourceMappingURL=sync-interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-interceptor.js","sourceRoot":"","sources":["../../../../src/core/sync/sync-interceptor.ts"],"names":[],"mappings":"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"}
@@ -247,6 +247,11 @@ export interface ExternalContainerContext {
247
247
  }
248
248
  /**
249
249
  * Extended increment metadata with multi-project support (v0.29.0+)
250
+ *
251
+ * NOTE (v0.29.0): featureId field was REMOVED
252
+ * Feature ID is derived from increment number: 0081 → FS-081
253
+ * Use deriveFeatureId() from src/utils/feature-id-derivation.ts
254
+ * See ADR-0140 for rationale
250
255
  */
251
256
  export interface IncrementMetadataV2 extends IncrementMetadata {
252
257
  /** Single project ID (backward compatible) */
@@ -255,8 +260,6 @@ export interface IncrementMetadataV2 extends IncrementMetadata {
255
260
  multiProject?: MultiProjectUserStory;
256
261
  /** External container context for 2-level directory structure */
257
262
  externalContainer?: ExternalContainerContext;
258
- /** Feature ID this increment belongs to */
259
- featureId?: string;
260
263
  /** Epic ID if part of an epic */
261
264
  epicId?: string;
262
265
  }
@@ -1 +1 @@
1
- {"version":3,"file":"increment-metadata.d.ts","sourceRoot":"","sources":["../../../../src/core/types/increment-metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"increment-metadata.d.ts","sourceRoot":"","sources":["../../../../src/core/types/increment-metadata.ts"],"names":[],"mappings":"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"}