abbu 0.8.1 → 0.18.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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +129 -2
  3. data/bin/abbu +158 -6
  4. data/bin/abbu-mcp +36 -0
  5. data/docs/ABBU.md +28 -0
  6. data/docs/ALTERNATE_CALENDAR_EVIDENCE.md +82 -0
  7. data/docs/CHANGELOG.md +98 -0
  8. data/docs/CONTRIBUTING.md +3 -0
  9. data/docs/FUZZY_MATCHING.md +72 -0
  10. data/docs/HISTORY_EVIDENCE.md +98 -0
  11. data/docs/ICALENDAR.md +101 -0
  12. data/docs/MACHINE_JSON.md +128 -0
  13. data/docs/MCP.md +148 -0
  14. data/docs/MERGE_PLANS.md +78 -0
  15. data/docs/MY_CARD_EVIDENCE.md +92 -0
  16. data/docs/PORTABLE_SQLITE.md +142 -0
  17. data/docs/RELEASING.md +76 -68
  18. data/docs/SNAPSHOT_DIFF.md +74 -0
  19. data/docs/SNAPSHOT_HISTORY.md +93 -0
  20. data/docs/STREAMING.md +73 -0
  21. data/docs/TODO.md +4 -4
  22. data/docs/WRITER_DECISION.md +90 -0
  23. data/lib/abbu/archive.rb +14 -0
  24. data/lib/abbu/exporters/csv_exporter.rb +7 -0
  25. data/lib/abbu/exporters/icalendar_encoding.rb +35 -0
  26. data/lib/abbu/exporters/icalendar_event.rb +61 -0
  27. data/lib/abbu/exporters/icalendar_exporter.rb +86 -0
  28. data/lib/abbu/exporters/json_exporter.rb +2 -2
  29. data/lib/abbu/exporters/jsonl_exporter.rb +23 -0
  30. data/lib/abbu/exporters/sqlite_exporter.rb +85 -0
  31. data/lib/abbu/exporters/sqlite_rows.rb +113 -0
  32. data/lib/abbu/exporters/sqlite_schema.rb +76 -0
  33. data/lib/abbu/exporters/vcard_exporter.rb +10 -11
  34. data/lib/abbu/exporters/vcard_photo.rb +50 -0
  35. data/lib/abbu/history_tracker.rb +96 -0
  36. data/lib/abbu/live_store.rb +11 -0
  37. data/lib/abbu/machine_command.rb +159 -0
  38. data/lib/abbu/machine_output.rb +52 -0
  39. data/lib/abbu/mcp/read_session.rb +57 -0
  40. data/lib/abbu/mcp/server.rb +100 -0
  41. data/lib/abbu/mcp.rb +11 -0
  42. data/lib/abbu/merge_plan.rb +132 -0
  43. data/lib/abbu/merge_preview.rb +35 -0
  44. data/lib/abbu/merge_values.rb +26 -0
  45. data/lib/abbu/parsers/plist_parser.rb +9 -0
  46. data/lib/abbu/parsers/sqlite_parser.rb +25 -0
  47. data/lib/abbu/snapshot_diff.rb +125 -0
  48. data/lib/abbu/snapshot_history.rb +66 -0
  49. data/lib/abbu/utils/fuzzy_matcher.rb +116 -0
  50. data/lib/abbu/version.rb +1 -1
  51. data/lib/abbu.rb +9 -0
  52. data/sig/fuzzy_matcher.rbs +22 -0
  53. data/sig/icalendar_exporter.rbs +13 -0
  54. data/sig/machine_output.rbs +23 -0
  55. data/sig/mcp.rbs +19 -0
  56. data/sig/merge_plan.rbs +16 -0
  57. data/sig/snapshot_diff.rbs +8 -0
  58. data/sig/snapshot_history.rbs +10 -0
  59. data/sig/sqlite_exporter.rbs +10 -0
  60. data/sig/streaming.rbs +27 -0
  61. data/sig/vcard_exporter.rbs +1 -1
  62. metadata +46 -2
@@ -0,0 +1,16 @@
1
+ # sig/merge_plan.rbs
2
+ module Abbu
3
+ class MergePlan
4
+ attr_reader policy: Symbol?
5
+ attr_reader fields: Hash[Symbol, untyped]
6
+ attr_reader sources: Array[untyped]
7
+ attr_reader conflicts: Hash[Symbol, untyped]
8
+ def initialize: (Contact left, Contact right, ?policy: Symbol?, ?source: String?) -> void
9
+ def to_h: () -> Hash[Symbol, untyped]
10
+ def materialize: () -> Contact
11
+ end
12
+ class MergePreview
13
+ def self.validate!: (Hash[Symbol, untyped] options) -> void
14
+ def self.plans: (Array[Contact] contacts, ?policy: Symbol?, ?source: String?) -> Array[Hash[Symbol, untyped]]
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ # sig/snapshot_diff.rbs
2
+ module Abbu
3
+ class SnapshotDiff
4
+ def initialize: (Archive | LiveStore | Enumerable[Contact] before, Archive | LiveStore | Enumerable[Contact] after, ?max_pairs: Integer) -> void
5
+ attr_reader result: Hash[Symbol, untyped]
6
+ def to_h: () -> Hash[Symbol, untyped]
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ # sig/snapshot_history.rbs
2
+ module Abbu
3
+ class SnapshotHistory
4
+ include Enumerable[Hash[Symbol, untyped]]
5
+ def initialize: (Enumerable[String] paths, ?strict: bool, ?retention: Integer, ?limits: Hash[Symbol, Integer]) -> void
6
+ def self.from_directory: (String path, **untyped options) -> SnapshotHistory
7
+ def each: () { (Hash[Symbol, untyped]) -> void } -> SnapshotHistory
8
+ | () -> Enumerator[Hash[Symbol, untyped], SnapshotHistory]
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # sig/sqlite_exporter.rbs
2
+ module Abbu
3
+ module Exporters
4
+ class SqliteExporter
5
+ SCHEMA_VERSION: Integer
6
+ def initialize: (Enumerable[Contact] contacts) -> void
7
+ def to_file: (String | Pathname path) -> String
8
+ end
9
+ end
10
+ end
data/sig/streaming.rbs ADDED
@@ -0,0 +1,27 @@
1
+ # sig/streaming.rbs
2
+ module Abbu
3
+ class Archive
4
+ def each_contact: () -> Enumerator[Contact, untyped]
5
+ | () { (Contact) -> void } -> self
6
+ end
7
+ class LiveStore
8
+ def each_contact: () -> Enumerator[Contact, untyped]
9
+ | () { (Contact) -> void } -> self
10
+ end
11
+ module Exporters
12
+ class JsonExporter
13
+ end
14
+ class CsvExporter
15
+ def write_to: (IO | StringIO io) -> nil
16
+ end
17
+ class VcardExporter
18
+ def write_to: (IO | StringIO io) -> nil
19
+ end
20
+ class JsonlExporter < JsonExporter
21
+ def initialize: (Enumerable[Contact] contacts) -> void
22
+ def write_to: (IO | StringIO io) -> nil
23
+ def to_file: (String | Pathname path) -> nil
24
+ def to_stdout: () -> nil
25
+ end
26
+ end
27
+ end
@@ -2,7 +2,7 @@
2
2
  module Abbu
3
3
  module Exporters
4
4
  class VcardExporter
5
- def initialize: (Enumerable[Contact] contacts) -> void
5
+ def initialize: (Enumerable[Contact] contacts, ?photo_mode: :uri | :embedded) -> void
6
6
  def to_file: (String | Pathname path) -> Integer
7
7
  def to_stdout: () -> nil
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abbu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stan Carver II
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-10-01 00:00:00.000000000 Z
11
+ date: 2026-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3
@@ -213,19 +213,34 @@ email:
213
213
  - stan@a1webconsulting.com
214
214
  executables:
215
215
  - abbu
216
+ - abbu-mcp
216
217
  extensions: []
217
218
  extra_rdoc_files: []
218
219
  files:
219
220
  - LICENSE
220
221
  - README.md
221
222
  - bin/abbu
223
+ - bin/abbu-mcp
222
224
  - docs/ABBU.md
225
+ - docs/ALTERNATE_CALENDAR_EVIDENCE.md
223
226
  - docs/API_STABILITY.md
224
227
  - docs/CHANGELOG.md
225
228
  - docs/CONTRIBUTING.md
226
229
  - docs/FORMAT_COMPATIBILITY.md
230
+ - docs/FUZZY_MATCHING.md
231
+ - docs/HISTORY_EVIDENCE.md
232
+ - docs/ICALENDAR.md
233
+ - docs/MACHINE_JSON.md
234
+ - docs/MCP.md
235
+ - docs/MERGE_PLANS.md
236
+ - docs/MY_CARD_EVIDENCE.md
237
+ - docs/PORTABLE_SQLITE.md
227
238
  - docs/RELEASING.md
239
+ - docs/SNAPSHOT_DIFF.md
240
+ - docs/SNAPSHOT_HISTORY.md
241
+ - docs/STREAMING.md
228
242
  - docs/TODO.md
243
+ - docs/WRITER_DECISION.md
229
244
  - examples/deduplicate_contacts.rb
230
245
  - examples/export_to_api.rb
231
246
  - examples/export_to_csv.rb
@@ -238,31 +253,60 @@ files:
238
253
  - lib/abbu/contact.rb
239
254
  - lib/abbu/diagnostic.rb
240
255
  - lib/abbu/exporters/csv_exporter.rb
256
+ - lib/abbu/exporters/icalendar_encoding.rb
257
+ - lib/abbu/exporters/icalendar_event.rb
258
+ - lib/abbu/exporters/icalendar_exporter.rb
241
259
  - lib/abbu/exporters/json_exporter.rb
260
+ - lib/abbu/exporters/jsonl_exporter.rb
261
+ - lib/abbu/exporters/sqlite_exporter.rb
262
+ - lib/abbu/exporters/sqlite_rows.rb
263
+ - lib/abbu/exporters/sqlite_schema.rb
242
264
  - lib/abbu/exporters/vcard_document.rb
243
265
  - lib/abbu/exporters/vcard_encoding.rb
244
266
  - lib/abbu/exporters/vcard_exporter.rb
267
+ - lib/abbu/exporters/vcard_photo.rb
245
268
  - lib/abbu/group.rb
246
269
  - lib/abbu/group_catalog.rb
270
+ - lib/abbu/history_tracker.rb
247
271
  - lib/abbu/image_extractor.rb
248
272
  - lib/abbu/live_store.rb
273
+ - lib/abbu/machine_command.rb
274
+ - lib/abbu/machine_output.rb
275
+ - lib/abbu/mcp.rb
276
+ - lib/abbu/mcp/read_session.rb
277
+ - lib/abbu/mcp/server.rb
278
+ - lib/abbu/merge_plan.rb
279
+ - lib/abbu/merge_preview.rb
280
+ - lib/abbu/merge_values.rb
249
281
  - lib/abbu/parse_error.rb
250
282
  - lib/abbu/parsers/plist_parser.rb
251
283
  - lib/abbu/parsers/sqlite_parser.rb
252
284
  - lib/abbu/query.rb
253
285
  - lib/abbu/schema_inspector.rb
286
+ - lib/abbu/snapshot_diff.rb
287
+ - lib/abbu/snapshot_history.rb
254
288
  - lib/abbu/source.rb
255
289
  - lib/abbu/source_catalog.rb
256
290
  - lib/abbu/timestamp_range.rb
257
291
  - lib/abbu/utils/contact_identity.rb
258
292
  - lib/abbu/utils/deduplicator.rb
293
+ - lib/abbu/utils/fuzzy_matcher.rb
259
294
  - lib/abbu/utils/image_resolver.rb
260
295
  - lib/abbu/utils/label_normalizer.rb
261
296
  - lib/abbu/utils/source_descriptor.rb
262
297
  - lib/abbu/version.rb
298
+ - sig/fuzzy_matcher.rbs
263
299
  - sig/group.rbs
300
+ - sig/icalendar_exporter.rbs
301
+ - sig/machine_output.rbs
302
+ - sig/mcp.rbs
303
+ - sig/merge_plan.rbs
264
304
  - sig/query.rbs
305
+ - sig/snapshot_diff.rbs
306
+ - sig/snapshot_history.rbs
265
307
  - sig/source.rbs
308
+ - sig/sqlite_exporter.rbs
309
+ - sig/streaming.rbs
266
310
  - sig/vcard_exporter.rbs
267
311
  - tasks/abbu.rake
268
312
  homepage: https://github.com/scarver2/abbu