spidersan 0.6.0 → 0.9.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 (214) hide show
  1. package/CHANGELOG.md +42 -52
  2. package/README.md +238 -3
  3. package/dist/bin/spidersan.d.ts.map +1 -1
  4. package/dist/bin/spidersan.js +13 -1
  5. package/dist/bin/spidersan.js.map +1 -1
  6. package/dist/commands/abandon.d.ts.map +1 -1
  7. package/dist/commands/abandon.js +1 -9
  8. package/dist/commands/abandon.js.map +1 -1
  9. package/dist/commands/ai.d.ts +15 -0
  10. package/dist/commands/ai.d.ts.map +1 -0
  11. package/dist/commands/ai.js +498 -0
  12. package/dist/commands/ai.js.map +1 -0
  13. package/dist/commands/auto.d.ts.map +1 -1
  14. package/dist/commands/auto.js +2 -1
  15. package/dist/commands/auto.js.map +1 -1
  16. package/dist/commands/bot.d.ts +16 -0
  17. package/dist/commands/bot.d.ts.map +1 -0
  18. package/dist/commands/bot.js +398 -0
  19. package/dist/commands/bot.js.map +1 -0
  20. package/dist/commands/conflicts.d.ts.map +1 -1
  21. package/dist/commands/conflicts.js +260 -277
  22. package/dist/commands/conflicts.js.map +1 -1
  23. package/dist/commands/context.d.ts +8 -0
  24. package/dist/commands/context.d.ts.map +1 -0
  25. package/dist/commands/context.js +104 -0
  26. package/dist/commands/context.js.map +1 -0
  27. package/dist/commands/cross-conflicts.d.ts.map +1 -1
  28. package/dist/commands/cross-conflicts.js +1 -41
  29. package/dist/commands/cross-conflicts.js.map +1 -1
  30. package/dist/commands/depends.d.ts.map +1 -1
  31. package/dist/commands/depends.js +1 -9
  32. package/dist/commands/depends.js.map +1 -1
  33. package/dist/commands/fleet-status.d.ts +14 -0
  34. package/dist/commands/fleet-status.d.ts.map +1 -0
  35. package/dist/commands/fleet-status.js +127 -0
  36. package/dist/commands/fleet-status.js.map +1 -0
  37. package/dist/commands/git-watch.d.ts +24 -0
  38. package/dist/commands/git-watch.d.ts.map +1 -0
  39. package/dist/commands/git-watch.js +84 -0
  40. package/dist/commands/git-watch.js.map +1 -0
  41. package/dist/commands/index.d.ts +5 -0
  42. package/dist/commands/index.d.ts.map +1 -1
  43. package/dist/commands/index.js +7 -0
  44. package/dist/commands/index.js.map +1 -1
  45. package/dist/commands/merge-order.d.ts.map +1 -1
  46. package/dist/commands/merge-order.js +18 -67
  47. package/dist/commands/merge-order.js.map +1 -1
  48. package/dist/commands/merged.d.ts.map +1 -1
  49. package/dist/commands/merged.js +1 -9
  50. package/dist/commands/merged.js.map +1 -1
  51. package/dist/commands/pulse.d.ts.map +1 -1
  52. package/dist/commands/pulse.js +134 -63
  53. package/dist/commands/pulse.js.map +1 -1
  54. package/dist/commands/queen.d.ts.map +1 -1
  55. package/dist/commands/queen.js +11 -7
  56. package/dist/commands/queen.js.map +1 -1
  57. package/dist/commands/ready-check.d.ts +2 -1
  58. package/dist/commands/ready-check.d.ts.map +1 -1
  59. package/dist/commands/ready-check.js +6 -30
  60. package/dist/commands/ready-check.js.map +1 -1
  61. package/dist/commands/register.d.ts.map +1 -1
  62. package/dist/commands/register.js +7 -29
  63. package/dist/commands/register.js.map +1 -1
  64. package/dist/commands/torrent.d.ts.map +1 -1
  65. package/dist/commands/torrent.js +29 -18
  66. package/dist/commands/torrent.js.map +1 -1
  67. package/dist/commands/watch.d.ts.map +1 -1
  68. package/dist/commands/watch.js +13 -34
  69. package/dist/commands/watch.js.map +1 -1
  70. package/dist/lib/ai/context-builder.d.ts +16 -0
  71. package/dist/lib/ai/context-builder.d.ts.map +1 -0
  72. package/dist/lib/ai/context-builder.js +216 -0
  73. package/dist/lib/ai/context-builder.js.map +1 -0
  74. package/dist/lib/ai/event-handler.d.ts +21 -0
  75. package/dist/lib/ai/event-handler.d.ts.map +1 -0
  76. package/dist/lib/ai/event-handler.js +98 -0
  77. package/dist/lib/ai/event-handler.js.map +1 -0
  78. package/dist/lib/ai/index.d.ts +13 -0
  79. package/dist/lib/ai/index.d.ts.map +1 -0
  80. package/dist/lib/ai/index.js +11 -0
  81. package/dist/lib/ai/index.js.map +1 -0
  82. package/dist/lib/ai/llm-client.d.ts +37 -0
  83. package/dist/lib/ai/llm-client.d.ts.map +1 -0
  84. package/dist/lib/ai/llm-client.js +225 -0
  85. package/dist/lib/ai/llm-client.js.map +1 -0
  86. package/dist/lib/ai/reasoner.d.ts +11 -0
  87. package/dist/lib/ai/reasoner.d.ts.map +1 -0
  88. package/dist/lib/ai/reasoner.js +246 -0
  89. package/dist/lib/ai/reasoner.js.map +1 -0
  90. package/dist/lib/ai/setup.d.ts +40 -0
  91. package/dist/lib/ai/setup.d.ts.map +1 -0
  92. package/dist/lib/ai/setup.js +154 -0
  93. package/dist/lib/ai/setup.js.map +1 -0
  94. package/dist/lib/ai/types.d.ts +135 -0
  95. package/dist/lib/ai/types.d.ts.map +1 -0
  96. package/dist/lib/ai/types.js +39 -0
  97. package/dist/lib/ai/types.js.map +1 -0
  98. package/dist/lib/colony-subscriber.d.ts +15 -12
  99. package/dist/lib/colony-subscriber.d.ts.map +1 -1
  100. package/dist/lib/colony-subscriber.js +146 -65
  101. package/dist/lib/colony-subscriber.js.map +1 -1
  102. package/dist/lib/config.d.ts.map +1 -1
  103. package/dist/lib/config.js +18 -4
  104. package/dist/lib/config.js.map +1 -1
  105. package/dist/lib/conflict-analyzer.d.ts +33 -0
  106. package/dist/lib/conflict-analyzer.d.ts.map +1 -0
  107. package/dist/lib/conflict-analyzer.js +114 -0
  108. package/dist/lib/conflict-analyzer.js.map +1 -0
  109. package/dist/lib/conflict-renderer.d.ts +7 -0
  110. package/dist/lib/conflict-renderer.d.ts.map +1 -0
  111. package/dist/lib/conflict-renderer.js +162 -0
  112. package/dist/lib/conflict-renderer.js.map +1 -0
  113. package/dist/lib/conflict-tier.d.ts +20 -0
  114. package/dist/lib/conflict-tier.d.ts.map +1 -0
  115. package/dist/lib/conflict-tier.js +49 -0
  116. package/dist/lib/conflict-tier.js.map +1 -0
  117. package/dist/lib/crypto.js +1 -1
  118. package/dist/lib/crypto.js.map +1 -1
  119. package/dist/lib/git-events-subscriber.d.ts +59 -0
  120. package/dist/lib/git-events-subscriber.d.ts.map +1 -0
  121. package/dist/lib/git-events-subscriber.js +779 -0
  122. package/dist/lib/git-events-subscriber.js.map +1 -0
  123. package/dist/lib/git.d.ts +15 -0
  124. package/dist/lib/git.d.ts.map +1 -0
  125. package/dist/lib/git.js +180 -0
  126. package/dist/lib/git.js.map +1 -0
  127. package/dist/lib/github.d.ts.map +1 -1
  128. package/dist/lib/github.js +14 -9
  129. package/dist/lib/github.js.map +1 -1
  130. package/dist/lib/graph.d.ts +23 -0
  131. package/dist/lib/graph.d.ts.map +1 -0
  132. package/dist/lib/graph.js +134 -0
  133. package/dist/lib/graph.js.map +1 -0
  134. package/dist/lib/hub.d.ts +31 -0
  135. package/dist/lib/hub.d.ts.map +1 -0
  136. package/dist/lib/hub.js +92 -0
  137. package/dist/lib/hub.js.map +1 -0
  138. package/dist/lib/remote-drift.d.ts +60 -0
  139. package/dist/lib/remote-drift.d.ts.map +1 -0
  140. package/dist/lib/remote-drift.js +225 -0
  141. package/dist/lib/remote-drift.js.map +1 -0
  142. package/dist/lib/salvage-analyzer.d.ts.map +1 -1
  143. package/dist/lib/salvage-analyzer.js +2 -3
  144. package/dist/lib/salvage-analyzer.js.map +1 -1
  145. package/dist/lib/security.d.ts +11 -0
  146. package/dist/lib/security.d.ts.map +1 -1
  147. package/dist/lib/security.js +24 -1
  148. package/dist/lib/security.js.map +1 -1
  149. package/dist/lib/session-logger.d.ts +54 -0
  150. package/dist/lib/session-logger.d.ts.map +1 -0
  151. package/dist/lib/session-logger.js +136 -0
  152. package/dist/lib/session-logger.js.map +1 -0
  153. package/dist/storage/adapter.d.ts +4 -0
  154. package/dist/storage/adapter.d.ts.map +1 -1
  155. package/dist/storage/branch-registry-store.d.ts +13 -0
  156. package/dist/storage/branch-registry-store.d.ts.map +1 -0
  157. package/dist/storage/branch-registry-store.js +2 -0
  158. package/dist/storage/branch-registry-store.js.map +1 -0
  159. package/dist/storage/factory.d.ts +4 -0
  160. package/dist/storage/factory.d.ts.map +1 -1
  161. package/dist/storage/factory.js +25 -9
  162. package/dist/storage/factory.js.map +1 -1
  163. package/dist/storage/git-messages.d.ts +53 -0
  164. package/dist/storage/git-messages.d.ts.map +1 -0
  165. package/dist/storage/git-messages.js +376 -0
  166. package/dist/storage/git-messages.js.map +1 -0
  167. package/dist/storage/index.d.ts +5 -0
  168. package/dist/storage/index.d.ts.map +1 -1
  169. package/dist/storage/index.js +5 -0
  170. package/dist/storage/index.js.map +1 -1
  171. package/dist/storage/json-branch-registry-store.d.ts +19 -0
  172. package/dist/storage/json-branch-registry-store.d.ts.map +1 -0
  173. package/dist/storage/json-branch-registry-store.js +112 -0
  174. package/dist/storage/json-branch-registry-store.js.map +1 -0
  175. package/dist/storage/local-messages.d.ts +37 -0
  176. package/dist/storage/local-messages.d.ts.map +1 -0
  177. package/dist/storage/local-messages.js +151 -0
  178. package/dist/storage/local-messages.js.map +1 -0
  179. package/dist/storage/local.d.ts +2 -6
  180. package/dist/storage/local.d.ts.map +1 -1
  181. package/dist/storage/local.js +13 -76
  182. package/dist/storage/local.js.map +1 -1
  183. package/dist/storage/memory-branch-registry-store.d.ts +16 -0
  184. package/dist/storage/memory-branch-registry-store.d.ts.map +1 -0
  185. package/dist/storage/memory-branch-registry-store.js +65 -0
  186. package/dist/storage/memory-branch-registry-store.js.map +1 -0
  187. package/dist/storage/message-adapter.d.ts +86 -0
  188. package/dist/storage/message-adapter.d.ts.map +1 -0
  189. package/dist/storage/message-adapter.js +28 -0
  190. package/dist/storage/message-adapter.js.map +1 -0
  191. package/dist/storage/message-factory.d.ts +36 -0
  192. package/dist/storage/message-factory.d.ts.map +1 -0
  193. package/dist/storage/message-factory.js +99 -0
  194. package/dist/storage/message-factory.js.map +1 -0
  195. package/dist/storage/mycmail-adapter.d.ts +38 -0
  196. package/dist/storage/mycmail-adapter.d.ts.map +1 -0
  197. package/dist/storage/mycmail-adapter.js +300 -0
  198. package/dist/storage/mycmail-adapter.js.map +1 -0
  199. package/dist/storage/supabase-registry-sync-client-impl.d.ts +46 -0
  200. package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -0
  201. package/dist/storage/supabase-registry-sync-client-impl.js +322 -0
  202. package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -0
  203. package/dist/storage/supabase-registry-sync-client.d.ts +9 -0
  204. package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -0
  205. package/dist/storage/supabase-registry-sync-client.js +2 -0
  206. package/dist/storage/supabase-registry-sync-client.js.map +1 -0
  207. package/dist/storage/supabase.d.ts +8 -46
  208. package/dist/storage/supabase.d.ts.map +1 -1
  209. package/dist/storage/supabase.js +30 -342
  210. package/dist/storage/supabase.js.map +1 -1
  211. package/dist/tui/screen.d.ts.map +1 -1
  212. package/dist/tui/screen.js +5 -3
  213. package/dist/tui/screen.js.map +1 -1
  214. package/package.json +92 -90
@@ -0,0 +1,84 @@
1
+ /**
2
+ * spidersan git-watch
3
+ *
4
+ * Starts a git-change notification daemon that subscribes to spidersan_git_events
5
+ * via Supabase Realtime and catches up on missed events via polling.
6
+ *
7
+ * Usage:
8
+ * spidersan git-watch # daemon mode (runs until Ctrl+C)
9
+ * spidersan git-watch --once # catch-up only, then exit
10
+ * spidersan git-watch --repos ~/Dev/Envoak:~/Dev/Toak
11
+ * spidersan git-watch --interval 30000 # poll every 30s
12
+ * spidersan git-watch --json # machine-readable log output
13
+ *
14
+ * Notifications:
15
+ * push events → warns agent to run `spidersan pulse`
16
+ * branch delete → marks registry entry abandoned, archives it
17
+ * PR/create → logged to activity.jsonl
18
+ *
19
+ * Pending events are written to ~/.spidersan/git-events-pending.jsonl for
20
+ * future AI-layer (spidersan-smol) processing (P2).
21
+ */
22
+ import { Command } from 'commander';
23
+ import { startGitWatch, catchUpOnce } from '../lib/git-events-subscriber.js';
24
+ export const gitWatchCommand = new Command('git-watch')
25
+ .description('Subscribe to git-change notifications from GitHub webhooks')
26
+ .option('--once', 'Catch up on missed events then exit (useful for cron)')
27
+ .option('--interval <ms>', 'Polling interval in ms for catch-up (default: 60000)', '60000')
28
+ .option('--repos <paths>', 'Colon-separated local repo paths to watch (default: auto-detect from ~/Dev)')
29
+ .option('--json', 'Machine-readable log output')
30
+ .option('--no-realtime', 'Disable WebSocket subscription (polling only)')
31
+ .option('--quiet', 'Suppress output')
32
+ .action(async (options) => {
33
+ const pollIntervalMs = parseInt(options.interval, 10);
34
+ const repoPaths = options.repos
35
+ ? options.repos.split(':').map((p) => p.trim()).filter(Boolean)
36
+ : [];
37
+ const logger = options.quiet
38
+ ? undefined
39
+ : options.json
40
+ ? (msg) => console.log(JSON.stringify({ ts: new Date().toISOString(), msg }))
41
+ : (msg) => console.log(`[git-watch] ${msg}`);
42
+ try {
43
+ if (options.once) {
44
+ await catchUpOnce({ repoPaths, logger, quiet: options.quiet });
45
+ if (!options.quiet)
46
+ console.log('[git-watch] catch-up complete');
47
+ process.exit(0);
48
+ }
49
+ const handle = await startGitWatch({
50
+ pollIntervalMs,
51
+ repoPaths,
52
+ logger,
53
+ quiet: options.quiet,
54
+ disableRealtime: options.realtime === false,
55
+ });
56
+ if (!options.quiet) {
57
+ console.log('[git-watch] daemon running — Ctrl+C to stop');
58
+ console.log('[git-watch] pending events: ~/.spidersan/git-events-pending.jsonl');
59
+ }
60
+ // Graceful shutdown
61
+ const shutdown = () => {
62
+ if (!options.quiet)
63
+ console.log('\n[git-watch] stopping');
64
+ handle.stop();
65
+ process.exit(0);
66
+ };
67
+ process.on('SIGINT', shutdown);
68
+ process.on('SIGTERM', shutdown);
69
+ }
70
+ catch (err) {
71
+ const msg = err instanceof Error ? err.message : String(err);
72
+ if (options.json) {
73
+ console.error(JSON.stringify({ error: msg }));
74
+ }
75
+ else {
76
+ console.error(`[git-watch] error: ${msg}`);
77
+ if (msg.includes('SUPABASE_URL')) {
78
+ console.error(' Set SUPABASE_URL and SUPABASE_KEY (or COLONY_SESSION_JWT) env vars');
79
+ }
80
+ }
81
+ process.exit(1);
82
+ }
83
+ });
84
+ //# sourceMappingURL=git-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-watch.js","sourceRoot":"","sources":["../../src/commands/git-watch.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,8 @@ export { rebaseHelperCommand } from './rebase-helper.js';
20
20
  export { registrySyncCommand } from './registry-sync.js';
21
21
  export { crossConflictsCommand } from './cross-conflicts.js';
22
22
  export { pulseCommand } from './pulse.js';
23
+ export { gitWatchCommand } from './git-watch.js';
24
+ export { fleetStatusCommand } from './fleet-status.js';
23
25
  export { loadEcosystemCommands, getEcosystemStatus } from './ecosystem-loader.js';
24
26
  export { githubSyncCommand } from './github-sync.js';
25
27
  export { syncAdvisorCommand } from './sync-advisor.js';
@@ -28,4 +30,7 @@ export { logCommand } from './log.js';
28
30
  export { dailyCommand } from './daily.js';
29
31
  export { torrentCommand } from './torrent.js';
30
32
  export { queenCommand } from './queen.js';
33
+ export { botCommand } from './bot.js';
34
+ export { contextCommand } from './context.js';
35
+ export { askCommand, adviseCommand, explainCommand, aiPingCommand, aiSetupCommand, aiTelemetryCommand, checkOptOutCommand } from './ai.js';
31
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGlF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGlF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -20,6 +20,8 @@ export { rebaseHelperCommand } from './rebase-helper.js';
20
20
  export { registrySyncCommand } from './registry-sync.js';
21
21
  export { crossConflictsCommand } from './cross-conflicts.js';
22
22
  export { pulseCommand } from './pulse.js';
23
+ export { gitWatchCommand } from './git-watch.js';
24
+ export { fleetStatusCommand } from './fleet-status.js';
23
25
  export { loadEcosystemCommands, getEcosystemStatus } from './ecosystem-loader.js';
24
26
  // F2/F4: GitHub inventory and sync advisor
25
27
  export { githubSyncCommand } from './github-sync.js';
@@ -34,4 +36,9 @@ export { dailyCommand } from './daily.js';
34
36
  export { torrentCommand } from './torrent.js';
35
37
  // Mode 3: Queen Spider
36
38
  export { queenCommand } from './queen.js';
39
+ // Bot: message-driven git ops via smalltoak
40
+ export { botCommand } from './bot.js';
41
+ // AI Core: Context, Ask, Advise, Explain
42
+ export { contextCommand } from './context.js';
43
+ export { askCommand, adviseCommand, explainCommand, aiPingCommand, aiSetupCommand, aiTelemetryCommand, checkOptOutCommand } from './ai.js';
37
44
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAElF,2CAA2C;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,uBAAuB;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAElF,2CAA2C;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,uBAAuB;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,4CAA4C;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,yCAAyC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"merge-order.d.ts","sourceRoot":"","sources":["../../src/commands/merge-order.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,iBAAiB,SAmFxB,CAAC"}
1
+ {"version":3,"file":"merge-order.d.ts","sourceRoot":"","sources":["../../src/commands/merge-order.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,iBAAiB,SA2FxB,CAAC"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { Command } from 'commander';
8
8
  import { getStorage } from '../storage/index.js';
9
+ import { buildConflictGraph, calculateBlockingCounts, topologicalSort } from '../lib/graph.js';
9
10
  export const mergeOrderCommand = new Command('merge-order')
10
11
  .description('Get optimal merge order for all branches')
11
12
  .option('--json', 'Output as JSON')
@@ -21,19 +22,21 @@ export const mergeOrderCommand = new Command('merge-order')
21
22
  console.log('🕷️ No branches registered.');
22
23
  return;
23
24
  }
25
+ const branchNames = branches.map(branch => branch.name);
26
+ const branchByName = new Map(branches.map(branch => [branch.name, branch]));
24
27
  // Build conflict graph
25
28
  const conflictGraph = buildConflictGraph(branches);
26
29
  // Calculate blocking counts (how many branches are blocked by each branch)
27
30
  const blockingCounts = options.blockingCount
28
- ? calculateBlockingCounts(branches, conflictGraph)
29
- : new Map();
31
+ ? calculateBlockingCounts(branchNames, conflictGraph)
32
+ : undefined;
30
33
  // Topological sort with conflict awareness (optionally prioritize by blocking count)
31
- const order = topologicalSort(branches, conflictGraph, blockingCounts, options.blockingCount);
34
+ const order = topologicalSort(branchNames, conflictGraph, blockingCounts);
32
35
  if (options.json) {
33
- const result = order.map(b => ({
34
- name: b.name,
35
- blocksCount: blockingCounts.get(b.name) || 0,
36
- conflicts: conflictGraph.get(b.name) || []
36
+ const result = order.map(name => ({
37
+ name,
38
+ blocksCount: blockingCounts?.get(name) || 0,
39
+ conflicts: conflictGraph.get(name) || []
37
40
  }));
38
41
  console.log(JSON.stringify({ order: result }, null, 2));
39
42
  return;
@@ -45,9 +48,13 @@ export const mergeOrderCommand = new Command('merge-order')
45
48
  else {
46
49
  console.log('🕷️ Recommended Merge Order:\n');
47
50
  }
48
- order.forEach((branch, i) => {
51
+ order.forEach((branchName, i) => {
52
+ const branch = branchByName.get(branchName);
53
+ if (!branch) {
54
+ return;
55
+ }
49
56
  const conflicts = conflictGraph.get(branch.name) || [];
50
- const blocksCount = blockingCounts.get(branch.name) || 0;
57
+ const blocksCount = blockingCounts?.get(branch.name) || 0;
51
58
  // Status indicator
52
59
  let status = '✅';
53
60
  let priorityTag = '';
@@ -68,7 +75,7 @@ export const mergeOrderCommand = new Command('merge-order')
68
75
  }
69
76
  else if (options.blockingCount && blocksCount > 0) {
70
77
  // Show which branches this one blocks
71
- const blockedBranches = getBlockedBranches(branch.name, branches, conflictGraph);
78
+ const blockedBranches = getBlockedBranches(branch.name, conflictGraph);
72
79
  if (blockedBranches.length > 0) {
73
80
  console.log(` └─ Blocks: ${blockedBranches.join(', ')}`);
74
81
  }
@@ -79,66 +86,10 @@ export const mergeOrderCommand = new Command('merge-order')
79
86
  console.log('💡 Merge high-priority (🔴) branches first to unblock others.');
80
87
  }
81
88
  });
82
- function buildConflictGraph(branches) {
83
- const graph = new Map();
84
- // Performance Optimization: Pre-compute sets of files for O(1) lookups
85
- // Reduces nested loop complexity from O(N^2 * M * K) to O(N^2 * M)
86
- const fileSets = new Map();
87
- for (const branch of branches) {
88
- fileSets.set(branch.name, new Set(branch.files));
89
- }
90
- for (const branch of branches) {
91
- const conflicts = [];
92
- for (const other of branches) {
93
- if (branch.name === other.name)
94
- continue;
95
- const otherFilesSet = fileSets.get(other.name);
96
- const overlap = branch.files.some(f => otherFilesSet.has(f));
97
- if (overlap) {
98
- conflicts.push(other.name);
99
- }
100
- }
101
- graph.set(branch.name, conflicts);
102
- }
103
- return graph;
104
- }
105
- function topologicalSort(branches, conflicts, blockingCounts, useBlockingOrder) {
106
- return [...branches].sort((a, b) => {
107
- // If using blocking-count mode, sort by most blocking first (rarest-first)
108
- if (useBlockingOrder) {
109
- const blocksA = blockingCounts.get(a.name) || 0;
110
- const blocksB = blockingCounts.get(b.name) || 0;
111
- if (blocksA !== blocksB) {
112
- return blocksB - blocksA; // Most blocking first
113
- }
114
- }
115
- // Default: fewest conflicts first
116
- const conflictsA = conflicts.get(a.name)?.length || 0;
117
- const conflictsB = conflicts.get(b.name)?.length || 0;
118
- if (conflictsA !== conflictsB) {
119
- return conflictsA - conflictsB;
120
- }
121
- // Oldest first (FIFO)
122
- return new Date(a.registeredAt).getTime() - new Date(b.registeredAt).getTime();
123
- });
124
- }
125
- /**
126
- * Calculate how many branches each branch blocks.
127
- * A branch "blocks" another if they share files (conflict).
128
- */
129
- function calculateBlockingCounts(branches, conflictGraph) {
130
- const counts = new Map();
131
- for (const branch of branches) {
132
- // Count how many branches conflict with this one (= are blocked by it)
133
- const conflictingBranches = conflictGraph.get(branch.name) || [];
134
- counts.set(branch.name, conflictingBranches.length);
135
- }
136
- return counts;
137
- }
138
89
  /**
139
90
  * Get list of branch names that are blocked by a given branch.
140
91
  */
141
- function getBlockedBranches(branchName, branches, conflictGraph) {
92
+ function getBlockedBranches(branchName, conflictGraph) {
142
93
  // Return the branches that this branch conflicts with
143
94
  return conflictGraph.get(branchName) || [];
144
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"merge-order.js","sourceRoot":"","sources":["../../src/commands/merge-order.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAQjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;KACtD,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,kBAAkB,EAAE,iEAAiE,CAAC;KAC7F,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;IACzC,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,IAAI,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO;IACX,CAAC;IAED,uBAAuB;IACvB,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEnD,2EAA2E;IAC3E,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa;QACxC,CAAC,CAAC,uBAAuB,CAAC,QAAQ,EAAE,aAAa,CAAC;QAClD,CAAC,CAAC,IAAI,GAAG,EAAkB,CAAC;IAEhC,qFAAqF;IACrF,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAE9F,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SAC7C,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO;IACX,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzD,mBAAmB;QACnB,IAAI,MAAM,GAAG,GAAG,CAAC;QACjB,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,IAAI,OAAO,CAAC,aAAa,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACjE,WAAW,GAAG,WAAW,IAAI,CAAC;gBAC1B,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,WAAW,IAAI,CAAC;oBACd,CAAC,CAAC,YAAY,WAAW,GAAG;oBAC5B,CAAC,CAAC,EAAE,CAAC;QACjB,CAAC;aAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,IAAI,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC;QAElE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,kCAAkC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,OAAO,CAAC,aAAa,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAClD,sCAAsC;YACtC,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;YACjF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IACjF,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,SAAS,kBAAkB,CAAC,QAAkB;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE1C,uEAAuE;IACvE,mEAAmE;IACnE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAChD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC5B,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;gBAAE,SAAS;YAEzC,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,OAAO,EAAE,CAAC;gBACV,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CACpB,QAAkB,EAClB,SAAgC,EAChC,cAAmC,EACnC,gBAA0B;IAE1B,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC/B,2EAA2E;QAC3E,IAAI,gBAAgB,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEhD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACtB,OAAO,OAAO,GAAG,OAAO,CAAC,CAAE,sBAAsB;YACrD,CAAC;QACL,CAAC;QAED,kCAAkC;QAClC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QAEtD,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YAC5B,OAAO,UAAU,GAAG,UAAU,CAAC;QACnC,CAAC;QAED,sBAAsB;QACtB,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;IACnF,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAC5B,QAAkB,EAClB,aAAoC;IAEpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC5B,uEAAuE;QACvE,MAAM,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACvB,UAAkB,EAClB,QAAkB,EAClB,aAAoC;IAEpC,sDAAsD;IACtD,OAAO,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"merge-order.js","sourceRoot":"","sources":["../../src/commands/merge-order.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"merged.d.ts","sourceRoot":"","sources":["../../src/commands/merged.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,aAAa,SA2BpB,CAAC"}
1
+ {"version":3,"file":"merged.d.ts","sourceRoot":"","sources":["../../src/commands/merged.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SA2BpB,CAAC"}
@@ -4,17 +4,9 @@
4
4
  * Mark a branch as merged.
5
5
  */
6
6
  import { Command } from 'commander';
7
- import { execFileSync } from 'child_process';
8
7
  import { getStorage } from '../storage/index.js';
9
8
  import { logActivity } from '../lib/activity.js';
10
- function getCurrentBranch() {
11
- try {
12
- return execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf-8' }).trim();
13
- }
14
- catch {
15
- throw new Error('Not in a git repository');
16
- }
17
- }
9
+ import { getCurrentBranch } from '../lib/git.js';
18
10
  export const mergedCommand = new Command('merged')
19
11
  .description('Mark a branch as merged')
20
12
  .argument('[branch]', 'Branch that was merged (default: current)')
@@ -1 +1 @@
1
- {"version":3,"file":"merged.js","sourceRoot":"","sources":["../../src/commands/merged.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,SAAS,gBAAgB;IACrB,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpG,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC7C,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CAAC,UAAU,EAAE,2CAA2C,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,OAAO,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,IAAI,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,IAAI,gBAAgB,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,aAAa,UAAU,0BAA0B,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1D,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE1H,OAAO,CAAC,GAAG,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"merged.js","sourceRoot":"","sources":["../../src/commands/merged.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC7C,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CAAC,UAAU,EAAE,2CAA2C,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,OAAO,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,IAAI,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,IAAI,gBAAgB,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,aAAa,UAAU,0BAA0B,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1D,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE1H,OAAO,CAAC,GAAG,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pulse.d.ts","sourceRoot":"","sources":["../../src/commands/pulse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4DpC,eAAO,MAAM,YAAY,SAgInB,CAAC"}
1
+ {"version":3,"file":"pulse.d.ts","sourceRoot":"","sources":["../../src/commands/pulse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,eAAO,MAAM,YAAY,SA2LnB,CAAC"}
@@ -10,53 +10,16 @@
10
10
  */
11
11
  import { Command } from 'commander';
12
12
  import { compilePatterns } from '../lib/regex-utils.js';
13
- import { execFileSync } from 'child_process';
14
13
  import { getStorage } from '../storage/index.js';
15
14
  import { syncFromColony } from '../lib/colony-subscriber.js';
16
15
  import { loadConfig } from '../lib/config.js';
17
- // Critical files TIER 3 block
18
- const TIER_3_PATTERNS = [
19
- /\.env$/,
20
- /secrets?\./i,
21
- /credentials/i,
22
- /password/i,
23
- /api[_-]?key/i,
24
- /private[_-]?key/i,
25
- /\.pem$/,
26
- /auth\.(ts|js)$/,
27
- /security\.(ts|js)$/,
28
- ];
29
- // Important files — TIER 2 pause
30
- const TIER_2_PATTERNS = [
31
- /package\.json$/,
32
- /package-lock\.json$/,
33
- /tsconfig\.json$/,
34
- /CLAUDE\.md$/,
35
- /\.gitignore$/,
36
- /server\.(ts|js)$/,
37
- /index\.(ts|js)$/,
38
- /config\.(ts|js)$/,
39
- ];
40
- const COMPILED_TIER_3 = compilePatterns(TIER_3_PATTERNS);
41
- const COMPILED_TIER_2 = compilePatterns(TIER_2_PATTERNS);
42
- function classifyTier(file, compiledHigh = [], compiledMedium = []) {
43
- const tier3 = [...COMPILED_TIER_3, ...compiledHigh];
44
- for (const p of tier3) {
45
- if (p.test(file))
46
- return 3;
47
- }
48
- const tier2 = [...COMPILED_TIER_2, ...compiledMedium];
49
- for (const p of tier2) {
50
- if (p.test(file))
51
- return 2;
52
- }
53
- return 1;
54
- }
55
- function getCurrentBranch() {
16
+ import { classifyTier } from '../lib/conflict-tier.js';
17
+ import { getCurrentBranch } from '../lib/git.js';
18
+ import { createHubClient } from '../lib/hub.js';
19
+ import { computeDriftResult } from '../lib/remote-drift.js';
20
+ function resolveCurrentBranch() {
56
21
  try {
57
- return execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
58
- encoding: 'utf-8',
59
- }).trim();
22
+ return getCurrentBranch();
60
23
  }
61
24
  catch {
62
25
  return 'unknown';
@@ -66,6 +29,9 @@ export const pulseCommand = new Command('pulse')
66
29
  .description('Sync from Colony then show active conflicts (quick health-check)')
67
30
  .option('--json', 'Output as JSON')
68
31
  .option('--no-sync', 'Skip Colony sync, use local registry only')
32
+ .option('--remote-drift', 'Check if remote has advanced past local HEAD')
33
+ .option('--hub-sync', 'Post drift alert to Hub if registered or unstaged files are in drift zone')
34
+ .option('--strict', 'Exit 1 if any registered or unstaged files are in the drift zone')
69
35
  .action(async (options) => {
70
36
  const storage = await getStorage();
71
37
  if (!await storage.isInitialized()) {
@@ -89,12 +55,17 @@ export const pulseCommand = new Command('pulse')
89
55
  console.log('ℹ Colony sync skipped (--no-sync)');
90
56
  }
91
57
  // ── Local conflict detection ──────────────────────────────────────────
92
- const currentBranch = getCurrentBranch();
58
+ const currentBranch = resolveCurrentBranch();
93
59
  const allBranches = await storage.list();
94
60
  const target = allBranches.find(b => b.name === currentBranch);
95
61
  if (!target) {
96
62
  if (options.json) {
97
- console.log(JSON.stringify({ branch: currentBranch, registered: false, conflicts: [], colonySynced, colonyOffline }));
63
+ const jsonOut = { branch: currentBranch, registered: false, conflicts: [], colonySynced, colonyOffline };
64
+ if (options.remoteDrift) {
65
+ const drift = await computeDriftResult([], { remote: 'origin', branch: currentBranch });
66
+ jsonOut.remoteDrift = 'skipped' in drift ? { skipped: true, reason: drift.reason } : drift;
67
+ }
68
+ console.log(JSON.stringify(jsonOut));
98
69
  }
99
70
  else {
100
71
  console.log(`🕷️ Branch "${currentBranch}" is not registered.`);
@@ -102,6 +73,16 @@ export const pulseCommand = new Command('pulse')
102
73
  if (!colonyOffline) {
103
74
  console.log(` Colony: synced ${colonySynced} claim(s)`);
104
75
  }
76
+ if (options.remoteDrift) {
77
+ console.log('');
78
+ const drift = await computeDriftResult([], { remote: 'origin', branch: currentBranch });
79
+ if ('skipped' in drift) {
80
+ console.log(`⚠ Remote drift check skipped: ${drift.reason}`);
81
+ }
82
+ else {
83
+ printDriftReport(drift);
84
+ }
85
+ }
105
86
  }
106
87
  return;
107
88
  }
@@ -116,7 +97,10 @@ export const pulseCommand = new Command('pulse')
116
97
  // Determine max tier for this conflict group
117
98
  let maxTier = 1;
118
99
  for (const file of overlapping) {
119
- const tier = classifyTier(file, compiledHigh, compiledMedium);
100
+ const tier = classifyTier(file, {
101
+ extraTier3: compiledHigh,
102
+ extraTier2: compiledMedium,
103
+ });
120
104
  if (tier > maxTier)
121
105
  maxTier = tier;
122
106
  }
@@ -129,13 +113,23 @@ export const pulseCommand = new Command('pulse')
129
113
  }
130
114
  conflicts.sort((a, b) => b.tier - a.tier);
131
115
  if (options.json) {
132
- console.log(JSON.stringify({
116
+ const jsonOutput = {
133
117
  branch: currentBranch,
134
118
  registered: true,
135
119
  conflicts,
136
120
  colonySynced,
137
121
  colonyOffline,
138
- }, null, 2));
122
+ };
123
+ if (options.remoteDrift) {
124
+ const drift = await computeDriftResult(target?.files ?? [], { remote: 'origin', branch: currentBranch });
125
+ if ('skipped' in drift) {
126
+ jsonOutput.remoteDrift = { skipped: true, reason: drift.reason };
127
+ }
128
+ else {
129
+ jsonOutput.remoteDrift = drift;
130
+ }
131
+ }
132
+ console.log(JSON.stringify(jsonOutput, null, 2));
139
133
  return;
140
134
  }
141
135
  // ── Human-readable output ─────────────────────────────────────────────
@@ -151,24 +145,101 @@ Branches: ${allBranches.filter(b => b.status === 'active').length} active
151
145
  console.log('');
152
146
  if (conflicts.length === 0) {
153
147
  console.log('✅ No conflicts detected. You\'re good to go!');
154
- return;
155
148
  }
156
- const tierIcons = { 1: '🟡', 2: '🟠', 3: '🔴' };
157
- const tierLabels = { 1: 'WARN', 2: 'PAUSE', 3: 'BLOCK' };
158
- for (const c of conflicts) {
159
- const icon = tierIcons[c.tier] ?? '🟡';
160
- const label = tierLabels[c.tier] ?? 'WARN';
161
- const agentTag = c.agent ? ` [@${c.agent}]` : '';
162
- console.log(`${icon} TIER ${c.tier} ${label}: ${c.branch}${agentTag}`);
163
- for (const f of c.files) {
164
- console.log(` • ${f}`);
149
+ else {
150
+ const tierIcons = { 1: '🟡', 2: '🟠', 3: '🔴' };
151
+ const tierLabels = { 1: 'WARN', 2: 'PAUSE', 3: 'BLOCK' };
152
+ for (const c of conflicts) {
153
+ const icon = tierIcons[c.tier] ?? '🟡';
154
+ const label = tierLabels[c.tier] ?? 'WARN';
155
+ const agentTag = c.agent ? ` [@${c.agent}]` : '';
156
+ console.log(`${icon} TIER ${c.tier} ${label}: ${c.branch}${agentTag}`);
157
+ for (const f of c.files) {
158
+ console.log(` • ${f}`);
159
+ }
160
+ console.log('');
165
161
  }
162
+ const t3 = conflicts.filter(c => c.tier === 3).length;
163
+ const t2 = conflicts.filter(c => c.tier === 2).length;
164
+ const t1 = conflicts.filter(c => c.tier === 1).length;
165
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
166
+ console.log(`📊 Summary: 🔴 ${t3} BLOCK | 🟠 ${t2} PAUSE | 🟡 ${t1} WARN`);
167
+ }
168
+ // ── Remote drift section ──────────────────────────────────────────────
169
+ if (options.remoteDrift) {
166
170
  console.log('');
171
+ const drift = await computeDriftResult(target?.files ?? [], { remote: 'origin', branch: currentBranch });
172
+ if ('skipped' in drift) {
173
+ console.log(`⚠ Remote drift check skipped: ${drift.reason}`);
174
+ }
175
+ else {
176
+ printDriftReport(drift);
177
+ if (options.hubSync) {
178
+ const hasRisk = drift.registeredInDrift.length > 0 || drift.unstagedInDrift.length > 0;
179
+ if (hasRisk) {
180
+ const hub = createHubClient();
181
+ const lines = [
182
+ `🕷️⚠️ Remote drift detected on \`${drift.branch}\``,
183
+ ` ${drift.remoteAhead} commit(s) ahead | ${drift.registeredInDrift.length} registered file(s) at risk | ${drift.unstagedInDrift.length} rebase-continue blocker(s)`,
184
+ ...drift.registeredInDrift.map(e => ` ${tierIcon(e.tier)} ${e.file}${e.unstaged ? ' [also has unstaged modifications]' : ''}`),
185
+ ];
186
+ await hub.postToChat({ agent: 'spidersan', name: 'Spidersan', message: lines.join('\n'), glyph: '🕷️' }).catch(() => { });
187
+ }
188
+ }
189
+ if (options.strict && (drift.registeredInDrift.length > 0 || drift.unstagedInDrift.length > 0)) {
190
+ process.exit(1);
191
+ }
192
+ }
167
193
  }
168
- const t3 = conflicts.filter(c => c.tier === 3).length;
169
- const t2 = conflicts.filter(c => c.tier === 2).length;
170
- const t1 = conflicts.filter(c => c.tier === 1).length;
171
- console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
172
- console.log(`📊 Summary: 🔴 ${t3} BLOCK | 🟠 ${t2} PAUSE | 🟡 ${t1} WARN`);
173
194
  });
195
+ function tierIcon(tier) {
196
+ if (tier === 3)
197
+ return '🔴';
198
+ if (tier === 2)
199
+ return '🟠';
200
+ if (tier === 1)
201
+ return '🟡';
202
+ return '⚪';
203
+ }
204
+ function printDriftReport(drift) {
205
+ if (drift.state === 'synced' || drift.remoteAhead === 0) {
206
+ console.log('✅ Remote drift: 0 commits ahead. Safe to push.');
207
+ return;
208
+ }
209
+ const tierLabels = { 1: 'TIER 1', 2: 'TIER 2', 3: 'TIER 3' };
210
+ console.log(`🕷️ REMOTE DRIFT — "${drift.branch}"`);
211
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
212
+ console.log(`Remote is ${drift.remoteAhead} commit(s) ahead of local.`);
213
+ console.log('');
214
+ console.log('Drift zone (files touched by remote commits):');
215
+ for (const entry of drift.driftZone.map(file => {
216
+ const found = [...drift.registeredInDrift, ...drift.unstagedInDrift].find(e => e.file === file);
217
+ return found ?? { file, registered: false, tier: null, unstaged: false };
218
+ })) {
219
+ const parts = [];
220
+ if (entry.registered && entry.tier !== null) {
221
+ parts.push(`registered — ${tierIcon(entry.tier)} ${tierLabels[entry.tier]}`);
222
+ }
223
+ if (entry.unstaged) {
224
+ parts.push('unstaged modification ⚠');
225
+ }
226
+ const label = parts.length > 0 ? ` [${parts.join('] [')}]` : ' [not registered, not modified]';
227
+ console.log(` ${entry.file}${label}`);
228
+ }
229
+ console.log('');
230
+ if (drift.registeredInDrift.length > 0) {
231
+ console.log(`⚠ ${drift.registeredInDrift.length} registered file(s) in drift zone. Rebase will conflict.`);
232
+ }
233
+ if (drift.rebaseContinueRisk) {
234
+ const blockers = drift.unstagedInDrift.map(e => e.file);
235
+ console.log('⚠ File(s) with unstaged modifications — git rebase --continue may block even');
236
+ console.log(' after resolving conflict markers. Fix: git checkout HEAD -- <file>');
237
+ for (const f of blockers) {
238
+ console.log(` ${f}`);
239
+ }
240
+ }
241
+ console.log('');
242
+ console.log(` git fetch origin`);
243
+ console.log(` git log --oneline ${drift.remote} -3`);
244
+ }
174
245
  //# sourceMappingURL=pulse.js.map