specweave 0.28.68 → 0.29.0

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 (234) 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 +1 -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 +34 -0
  234. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +51 -0
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Notifications Command
3
+ *
4
+ * View and manage sync notifications.
5
+ *
6
+ * @module cli/commands/notifications
7
+ */
8
+ import { Command } from 'commander';
9
+ import path from 'path';
10
+ import { NotificationManager } from '../../core/notifications/notification-manager.js';
11
+ import { getSeverityEmoji, getNotificationTypeLabel, } from '../../core/notifications/notification-types.js';
12
+ import { consoleLogger } from '../../utils/logger.js';
13
+ /**
14
+ * Create the notifications command
15
+ */
16
+ export function createNotificationsCommand(options = {}) {
17
+ const logger = options.logger ?? consoleLogger;
18
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
19
+ const command = new Command('notifications')
20
+ .description('View and manage sync notifications')
21
+ .option('--all', 'Include dismissed notifications')
22
+ .option('--type <type>', 'Filter by notification type')
23
+ .option('--severity <level>', 'Filter by severity level')
24
+ .option('--json', 'Output as JSON')
25
+ .action(async (cmdOptions) => {
26
+ await listNotifications({
27
+ ...cmdOptions,
28
+ logger,
29
+ specweavePath,
30
+ });
31
+ });
32
+ // Subcommand: show
33
+ command
34
+ .command('show <id>')
35
+ .description('Show notification details')
36
+ .option('--json', 'Output as JSON')
37
+ .action(async (id, opts) => {
38
+ await showNotification(id, {
39
+ json: opts.json,
40
+ logger,
41
+ specweavePath,
42
+ });
43
+ });
44
+ // Subcommand: dismiss
45
+ command
46
+ .command('dismiss <id>')
47
+ .description('Dismiss a notification')
48
+ .action(async (id) => {
49
+ await dismissNotification(id, { logger, specweavePath });
50
+ });
51
+ // Subcommand: dismiss-all
52
+ command
53
+ .command('dismiss-all')
54
+ .description('Dismiss all pending notifications')
55
+ .option('-y, --yes', 'Skip confirmation')
56
+ .action(async (opts) => {
57
+ await dismissAllNotifications({ skipConfirm: opts.yes, logger, specweavePath });
58
+ });
59
+ return command;
60
+ }
61
+ /**
62
+ * List notifications
63
+ */
64
+ export async function listNotifications(options) {
65
+ const logger = options.logger ?? consoleLogger;
66
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
67
+ const manager = new NotificationManager({ specweavePath, logger });
68
+ const notifications = await manager.getAll({
69
+ type: options.type,
70
+ severity: options.severity,
71
+ includeDismissed: options.all,
72
+ });
73
+ if (options.json) {
74
+ console.log(JSON.stringify(notifications, null, 2));
75
+ return;
76
+ }
77
+ const pending = notifications.filter(n => !n.dismissedAt);
78
+ const header = options.all
79
+ ? `📬 ALL NOTIFICATIONS (${notifications.length})`
80
+ : `📬 PENDING NOTIFICATIONS (${pending.length})`;
81
+ console.log(header);
82
+ console.log('━'.repeat(50));
83
+ if (notifications.length === 0) {
84
+ console.log('No notifications found.');
85
+ return;
86
+ }
87
+ for (const notif of notifications) {
88
+ console.log(formatNotificationLine(notif));
89
+ }
90
+ console.log('');
91
+ console.log("Use '/specweave:notifications show <id>' to view details");
92
+ console.log("Use '/specweave:notifications dismiss <id>' to dismiss");
93
+ }
94
+ /**
95
+ * Show notification details
96
+ */
97
+ export async function showNotification(id, options) {
98
+ const logger = options.logger ?? consoleLogger;
99
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
100
+ const manager = new NotificationManager({ specweavePath, logger });
101
+ const notification = await manager.getById(id);
102
+ if (!notification) {
103
+ console.error(`❌ Notification not found: ${id}`);
104
+ process.exitCode = 1;
105
+ return;
106
+ }
107
+ if (options.json) {
108
+ console.log(JSON.stringify(notification, null, 2));
109
+ return;
110
+ }
111
+ console.log('📬 NOTIFICATION DETAILS');
112
+ console.log('━'.repeat(50));
113
+ console.log('');
114
+ console.log(`ID: ${notification.id}`);
115
+ console.log(`Type: ${getNotificationTypeLabel(notification.type)}`);
116
+ console.log(`Severity: ${getSeverityEmoji(notification.severity)} ${notification.severity}`);
117
+ console.log(`Title: ${notification.title}`);
118
+ console.log(`Message: ${notification.message}`);
119
+ console.log(`Created: ${formatDate(notification.createdAt)} (${formatRelativeTime(notification.createdAt)})`);
120
+ if (notification.readAt) {
121
+ console.log(`Read: ${formatDate(notification.readAt)}`);
122
+ }
123
+ if (notification.dismissedAt) {
124
+ console.log(`Dismissed: ${formatDate(notification.dismissedAt)}`);
125
+ }
126
+ if (notification.data && Object.keys(notification.data).length > 0) {
127
+ console.log('');
128
+ console.log('Data:');
129
+ for (const [key, value] of Object.entries(notification.data)) {
130
+ console.log(` ${key}: ${JSON.stringify(value)}`);
131
+ }
132
+ }
133
+ }
134
+ /**
135
+ * Dismiss a notification
136
+ */
137
+ export async function dismissNotification(id, options) {
138
+ const logger = options.logger ?? consoleLogger;
139
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
140
+ const manager = new NotificationManager({ specweavePath, logger });
141
+ const notification = await manager.getById(id);
142
+ if (!notification) {
143
+ console.error(`❌ Notification not found: ${id}`);
144
+ process.exitCode = 1;
145
+ return;
146
+ }
147
+ if (notification.dismissedAt) {
148
+ console.log(`ℹ️ Notification ${id} is already dismissed`);
149
+ return;
150
+ }
151
+ await manager.dismiss([id]);
152
+ const remaining = await manager.getPending();
153
+ console.log(`✅ Dismissed notification ${id}`);
154
+ console.log('');
155
+ console.log(`Remaining: ${remaining.length} pending notifications`);
156
+ }
157
+ /**
158
+ * Dismiss all pending notifications
159
+ */
160
+ export async function dismissAllNotifications(options) {
161
+ const logger = options.logger ?? consoleLogger;
162
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
163
+ const manager = new NotificationManager({ specweavePath, logger });
164
+ const pending = await manager.getPending();
165
+ if (pending.length === 0) {
166
+ console.log('ℹ️ No pending notifications to dismiss');
167
+ return;
168
+ }
169
+ if (!options.skipConfirm) {
170
+ // In non-interactive mode, require --yes flag
171
+ console.log(`⚠️ This will dismiss ${pending.length} pending notifications.`);
172
+ console.log('Use --yes flag to confirm: /specweave:notifications dismiss-all --yes');
173
+ return;
174
+ }
175
+ await manager.dismissAll();
176
+ console.log(`✅ Dismissed ${pending.length} notifications`);
177
+ }
178
+ /**
179
+ * Format a notification for list display
180
+ */
181
+ function formatNotificationLine(notif) {
182
+ const id = notif.id.padEnd(14);
183
+ const emoji = getSeverityEmoji(notif.severity);
184
+ const severity = notif.severity.toUpperCase().padEnd(8);
185
+ const title = truncate(notif.title, 30);
186
+ const age = formatRelativeTime(notif.createdAt);
187
+ const dismissed = notif.dismissedAt ? ' [dismissed]' : '';
188
+ return `${id} ${emoji} ${severity} ${title} ${age}${dismissed}`;
189
+ }
190
+ /**
191
+ * Format ISO date to readable string
192
+ */
193
+ function formatDate(isoDate) {
194
+ const date = new Date(isoDate);
195
+ return date.toLocaleString('en-US', {
196
+ year: 'numeric',
197
+ month: '2-digit',
198
+ day: '2-digit',
199
+ hour: '2-digit',
200
+ minute: '2-digit',
201
+ second: '2-digit',
202
+ });
203
+ }
204
+ /**
205
+ * Format time relative to now
206
+ */
207
+ function formatRelativeTime(isoDate) {
208
+ const timestamp = new Date(isoDate).getTime();
209
+ const now = Date.now();
210
+ const diffMs = now - timestamp;
211
+ if (diffMs < 60 * 1000) {
212
+ return 'just now';
213
+ }
214
+ const minutes = Math.floor(diffMs / (60 * 1000));
215
+ if (minutes < 60) {
216
+ return `${minutes}m ago`;
217
+ }
218
+ const hours = Math.floor(minutes / 60);
219
+ if (hours < 24) {
220
+ return `${hours}h ago`;
221
+ }
222
+ const days = Math.floor(hours / 24);
223
+ return `${days}d ago`;
224
+ }
225
+ /**
226
+ * Truncate text to fit width
227
+ */
228
+ function truncate(text, maxWidth) {
229
+ if (text.length <= maxWidth) {
230
+ return text.padEnd(maxWidth);
231
+ }
232
+ return text.slice(0, maxWidth - 3) + '...';
233
+ }
234
+ // Export helpers for testing
235
+ export { formatNotificationLine, formatDate, formatRelativeTime, };
236
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../../../src/cli/commands/notifications.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAIL,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAU,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAY9D;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAGvC,EAAE;IACJ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAEtF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;SACzC,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,OAAO,EAAE,iCAAiC,CAAC;SAClD,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;SACxD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,UAAgC,EAAE,EAAE;QACjD,MAAM,iBAAiB,CAAC;YACtB,GAAG,UAAU;YACb,MAAM;YACN,aAAa;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAAwB,EAAE,EAAE;QACrD,MAAM,gBAAgB,CAAC,EAAE,EAAE;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM;YACN,aAAa;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,sBAAsB;IACtB,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,mBAAmB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEL,0BAA0B;IAC1B,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;QACxC,MAAM,uBAAuB,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAGvC;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAEtF,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnE,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;QACzC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,gBAAgB,EAAE,OAAO,CAAC,GAAG;KAC9B,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG;QACxB,CAAC,CAAC,yBAAyB,aAAa,CAAC,MAAM,GAAG;QAClD,CAAC,CAAC,6BAA6B,OAAO,CAAC,MAAM,GAAG,CAAC;IAEnD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAU,EACV,OAIC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAEtF,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,wBAAwB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,cAAc,gBAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,cAAc,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,cAAc,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAEhH,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAU,EACV,OAGC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAEtF,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,CAAC,MAAM,wBAAwB,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAI7C;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAEtF,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,8CAA8C;QAC9C,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,MAAM,yBAAyB,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,KAAmB;IACjD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1D,OAAO,GAAG,EAAE,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK,GAAG,GAAG,SAAS,EAAE,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,OAAe;IACjC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAClC,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC;IAE/B,IAAI,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACjD,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,OAAO,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,IAAY,EAAE,QAAgB;IAC9C,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC7C,CAAC;AAED,6BAA6B;AAC7B,OAAO,EACL,sBAAsB,EACtB,UAAU,EACV,kBAAkB,GACnB,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Sync Logs Command
3
+ *
4
+ * Query and export sync audit logs.
5
+ *
6
+ * @module cli/commands/sync-logs
7
+ */
8
+ import { Command } from 'commander';
9
+ import { LogQuery, LogQueryResult } from '../../core/logs/log-aggregator.js';
10
+ import { AuditLogEntry } from '../../core/sync/sync-audit-logger.js';
11
+ import { SyncPlatform } from '../../core/types/sync-config.js';
12
+ import { SyncOperation } from '../../core/sync/permission-enforcer.js';
13
+ import { Logger } from '../../utils/logger.js';
14
+ /**
15
+ * Sync logs command options
16
+ */
17
+ export interface SyncLogsOptions {
18
+ since?: string;
19
+ until?: string;
20
+ platform?: SyncPlatform;
21
+ operation?: SyncOperation;
22
+ result?: 'success' | 'denied' | 'error';
23
+ limit?: number;
24
+ export?: string;
25
+ json?: boolean;
26
+ }
27
+ /**
28
+ * Create the sync-logs command
29
+ */
30
+ export declare function createSyncLogsCommand(options?: {
31
+ logger?: Logger;
32
+ specweavePath?: string;
33
+ }): Command;
34
+ /**
35
+ * Run the sync logs command
36
+ */
37
+ export declare function runSyncLogs(options: SyncLogsOptions & {
38
+ logger?: Logger;
39
+ specweavePath?: string;
40
+ }): Promise<void>;
41
+ /**
42
+ * Format log entries for human-readable output
43
+ */
44
+ declare function formatLogOutput(result: LogQueryResult, query: LogQuery): string;
45
+ /**
46
+ * Format a single log entry line
47
+ */
48
+ declare function formatLogLine(entry: AuditLogEntry): string;
49
+ /**
50
+ * Parse date string to Date object
51
+ */
52
+ declare function parseDate(dateStr: string): Date;
53
+ export { formatLogOutput, formatLogLine, parseDate, };
54
+ //# sourceMappingURL=sync-logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-logs.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/sync-logs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAiB,QAAQ,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAE5F,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAWD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CA0Bf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DhB;AAED;;GAEG;AACH,iBAAS,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAoDxE;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAUnD;AA2DD;;GAEG;AACH,iBAAS,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAcxC;AAaD,OAAO,EACL,eAAe,EACf,aAAa,EACb,SAAS,GACV,CAAC"}
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Sync Logs Command
3
+ *
4
+ * Query and export sync audit logs.
5
+ *
6
+ * @module cli/commands/sync-logs
7
+ */
8
+ import { Command } from 'commander';
9
+ import path from 'path';
10
+ import { LogAggregator } from '../../core/logs/log-aggregator.js';
11
+ import { LogExporter } from '../../core/logs/log-exporter.js';
12
+ import { consoleLogger } from '../../utils/logger.js';
13
+ /**
14
+ * Result emoji mapping
15
+ */
16
+ const RESULT_EMOJI = {
17
+ success: '✅',
18
+ denied: '🚫',
19
+ error: '❌',
20
+ };
21
+ /**
22
+ * Create the sync-logs command
23
+ */
24
+ export function createSyncLogsCommand(options = {}) {
25
+ const logger = options.logger ?? consoleLogger;
26
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
27
+ const command = new Command('sync-logs')
28
+ .description('Query and export sync audit logs')
29
+ .option('--since <date>', 'Start date (ISO 8601 or YYYY-MM-DD)')
30
+ .option('--until <date>', 'End date (ISO 8601 or YYYY-MM-DD)')
31
+ .option('--platform <name>', 'Filter by platform (github|jira|ado)')
32
+ .option('--operation <type>', 'Filter by operation type')
33
+ .option('--result <result>', 'Filter by result (success|denied|error)')
34
+ .option('--limit <n>', 'Maximum entries to return', '100')
35
+ .option('--export <path>', 'Export to file (JSON, JSONL, or CSV)')
36
+ .option('--json', 'Output as JSON')
37
+ .action(async (cmdOptions) => {
38
+ await runSyncLogs({
39
+ ...cmdOptions,
40
+ limit: typeof cmdOptions.limit === 'string'
41
+ ? parseInt(cmdOptions.limit, 10)
42
+ : cmdOptions.limit,
43
+ logger,
44
+ specweavePath,
45
+ });
46
+ });
47
+ return command;
48
+ }
49
+ /**
50
+ * Run the sync logs command
51
+ */
52
+ export async function runSyncLogs(options) {
53
+ const logger = options.logger ?? consoleLogger;
54
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
55
+ const aggregator = new LogAggregator({ specweavePath, logger });
56
+ // Build query from options
57
+ const query = {
58
+ limit: options.limit ?? 100,
59
+ };
60
+ if (options.since) {
61
+ query.since = parseDate(options.since);
62
+ }
63
+ else {
64
+ // Default: last 24 hours
65
+ query.since = new Date(Date.now() - 24 * 60 * 60 * 1000);
66
+ }
67
+ if (options.until) {
68
+ query.until = parseDate(options.until);
69
+ }
70
+ if (options.platform) {
71
+ query.platform = options.platform;
72
+ }
73
+ if (options.operation) {
74
+ query.operation = options.operation;
75
+ }
76
+ if (options.result) {
77
+ query.result = options.result;
78
+ }
79
+ try {
80
+ const result = await aggregator.query(query);
81
+ // Export to file if requested
82
+ if (options.export) {
83
+ const exporter = new LogExporter({ logger });
84
+ await exporter.export(result, options.export);
85
+ console.log(`✅ Exported ${result.entries.length} entries to ${options.export}`);
86
+ return;
87
+ }
88
+ // Output as JSON if requested
89
+ if (options.json) {
90
+ console.log(JSON.stringify(result, null, 2));
91
+ return;
92
+ }
93
+ // Format and print human-readable output
94
+ const output = formatLogOutput(result, query);
95
+ console.log(output);
96
+ }
97
+ catch (error) {
98
+ logger.error(`Failed to query logs: ${error}`);
99
+ console.error(`❌ Failed to query logs: ${error}`);
100
+ process.exitCode = 1;
101
+ }
102
+ }
103
+ /**
104
+ * Format log entries for human-readable output
105
+ */
106
+ function formatLogOutput(result, query) {
107
+ const lines = [];
108
+ // Header
109
+ const timeRange = formatTimeRange(query);
110
+ const filters = formatFilters(query);
111
+ const header = `📋 SYNC LOGS (${timeRange})${filters}`;
112
+ lines.push(header);
113
+ lines.push('━'.repeat(70));
114
+ lines.push('');
115
+ if (result.entries.length === 0) {
116
+ lines.push('No log entries found for the specified criteria.');
117
+ return lines.join('\n');
118
+ }
119
+ // Column headers
120
+ lines.push('TIMESTAMP'.padEnd(20) +
121
+ 'PLATFORM'.padEnd(10) +
122
+ 'OPERATION'.padEnd(18) +
123
+ 'ITEM'.padEnd(12) +
124
+ 'RESULT'.padEnd(12) +
125
+ 'TIME');
126
+ lines.push('-'.repeat(70));
127
+ // Entries
128
+ for (const entry of result.entries) {
129
+ lines.push(formatLogLine(entry));
130
+ // Show reason for denied entries
131
+ if (entry.result === 'denied' && entry.reason) {
132
+ lines.push(` Reason: ${entry.reason}`);
133
+ }
134
+ // Show error for failed entries
135
+ if (entry.result === 'error' && entry.error) {
136
+ lines.push(` Error: ${entry.error}`);
137
+ }
138
+ }
139
+ // Footer
140
+ lines.push('');
141
+ if (result.hasMore) {
142
+ lines.push(`Showing ${result.entries.length} of ${result.total} entries`);
143
+ lines.push('Use --limit to show more, --export to save all');
144
+ }
145
+ else {
146
+ lines.push(`Showing ${result.entries.length} entries (query took ${result.executionTimeMs}ms)`);
147
+ }
148
+ return lines.join('\n');
149
+ }
150
+ /**
151
+ * Format a single log entry line
152
+ */
153
+ function formatLogLine(entry) {
154
+ const timestamp = formatTimestamp(entry.timestamp).padEnd(20);
155
+ const platform = entry.platform.padEnd(10);
156
+ const operation = entry.operation.padEnd(18);
157
+ const itemId = truncate(entry.itemId, 10).padEnd(12);
158
+ const emoji = RESULT_EMOJI[entry.result] || '❓';
159
+ const result = `${emoji} ${entry.result}`.padEnd(12);
160
+ const duration = entry.durationMs ? `${entry.durationMs}ms` : '-';
161
+ return `${timestamp}${platform}${operation}${itemId}${result}${duration}`;
162
+ }
163
+ /**
164
+ * Format timestamp for display
165
+ */
166
+ function formatTimestamp(isoDate) {
167
+ const date = new Date(isoDate);
168
+ return date.toISOString().replace('T', ' ').slice(0, 19);
169
+ }
170
+ /**
171
+ * Format time range description
172
+ */
173
+ function formatTimeRange(query) {
174
+ if (query.since && query.until) {
175
+ return `${formatDate(query.since)} to ${formatDate(query.until)}`;
176
+ }
177
+ if (query.since) {
178
+ const now = Date.now();
179
+ const sinceTime = query.since.getTime();
180
+ const diffHours = Math.round((now - sinceTime) / (60 * 60 * 1000));
181
+ if (diffHours <= 24) {
182
+ return 'last 24 hours';
183
+ }
184
+ if (diffHours <= 168) {
185
+ return `last ${Math.round(diffHours / 24)} days`;
186
+ }
187
+ return `since ${formatDate(query.since)}`;
188
+ }
189
+ return 'all time';
190
+ }
191
+ /**
192
+ * Format active filters
193
+ */
194
+ function formatFilters(query) {
195
+ const filters = [];
196
+ if (query.platform) {
197
+ filters.push(query.platform);
198
+ }
199
+ if (query.operation) {
200
+ filters.push(query.operation);
201
+ }
202
+ if (query.result) {
203
+ filters.push(`${query.result} only`);
204
+ }
205
+ return filters.length > 0 ? ` [${filters.join(', ')}]` : '';
206
+ }
207
+ /**
208
+ * Format date for display
209
+ */
210
+ function formatDate(date) {
211
+ return date.toISOString().split('T')[0];
212
+ }
213
+ /**
214
+ * Parse date string to Date object
215
+ */
216
+ function parseDate(dateStr) {
217
+ // Try ISO format first
218
+ const date = new Date(dateStr);
219
+ if (!isNaN(date.getTime())) {
220
+ return date;
221
+ }
222
+ // Try YYYY-MM-DD
223
+ const parts = dateStr.split('-');
224
+ if (parts.length === 3) {
225
+ return new Date(parseInt(parts[0]), parseInt(parts[1]) - 1, parseInt(parts[2]));
226
+ }
227
+ throw new Error(`Invalid date format: ${dateStr}`);
228
+ }
229
+ /**
230
+ * Truncate text to fit width
231
+ */
232
+ function truncate(text, maxWidth) {
233
+ if (text.length <= maxWidth) {
234
+ return text;
235
+ }
236
+ return text.slice(0, maxWidth - 2) + '..';
237
+ }
238
+ // Export for testing
239
+ export { formatLogOutput, formatLogLine, parseDate, };
240
+ //# sourceMappingURL=sync-logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-logs.js","sourceRoot":"","sources":["../../../../src/cli/commands/sync-logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Sync Monitor Command
3
+ *
4
+ * Displays the sync orchestration dashboard with job statuses,
5
+ * notifications, and recent activity.
6
+ *
7
+ * @module cli/commands/sync-monitor
8
+ */
9
+ import { Command } from 'commander';
10
+ import { DashboardDataProvider, DashboardData, DashboardJobInfo } from '../../core/dashboard/dashboard-data.js';
11
+ import { Logger } from '../../utils/logger.js';
12
+ /**
13
+ * Sync monitor command options
14
+ */
15
+ export interface SyncMonitorOptions {
16
+ json?: boolean;
17
+ }
18
+ /**
19
+ * Create the sync-monitor command
20
+ */
21
+ export declare function createSyncMonitorCommand(options?: {
22
+ logger?: Logger;
23
+ specweavePath?: string;
24
+ }): Command;
25
+ /**
26
+ * Run the sync monitor command
27
+ */
28
+ export declare function runSyncMonitor(options: {
29
+ json?: boolean;
30
+ logger?: Logger;
31
+ specweavePath?: string;
32
+ }): Promise<void>;
33
+ /**
34
+ * Format the dashboard data as an ASCII box
35
+ */
36
+ declare function formatDashboard(data: DashboardData, provider: DashboardDataProvider): string;
37
+ /**
38
+ * Format a job line for display
39
+ */
40
+ declare function formatJobLine(job: DashboardJobInfo, provider: DashboardDataProvider): string;
41
+ export { formatDashboard, formatJobLine };
42
+ //# sourceMappingURL=sync-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-monitor.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/sync-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EACjB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAuBD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAgBf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhB;AAED;;GAEG;AACH,iBAAS,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAwDrF;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAqBrF;AA2CD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC"}