omnifocus-operator 1.4__py3-none-any.whl

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 (85) hide show
  1. omnifocus_operator/__init__.py +5 -0
  2. omnifocus_operator/__main__.py +65 -0
  3. omnifocus_operator/_version.py +24 -0
  4. omnifocus_operator/agent_messages/__init__.py +10 -0
  5. omnifocus_operator/agent_messages/descriptions.py +594 -0
  6. omnifocus_operator/agent_messages/errors.py +221 -0
  7. omnifocus_operator/agent_messages/warnings.py +194 -0
  8. omnifocus_operator/bridge/__init__.py +33 -0
  9. omnifocus_operator/bridge/bridge.js +464 -0
  10. omnifocus_operator/bridge/errors.py +79 -0
  11. omnifocus_operator/bridge/mtime.py +47 -0
  12. omnifocus_operator/bridge/real.py +296 -0
  13. omnifocus_operator/config.py +200 -0
  14. omnifocus_operator/contracts/__init__.py +176 -0
  15. omnifocus_operator/contracts/base.py +110 -0
  16. omnifocus_operator/contracts/protocols.py +121 -0
  17. omnifocus_operator/contracts/shared/__init__.py +0 -0
  18. omnifocus_operator/contracts/shared/actions.py +125 -0
  19. omnifocus_operator/contracts/shared/dates.py +21 -0
  20. omnifocus_operator/contracts/shared/repetition_rule.py +262 -0
  21. omnifocus_operator/contracts/use_cases/__init__.py +0 -0
  22. omnifocus_operator/contracts/use_cases/add/__init__.py +18 -0
  23. omnifocus_operator/contracts/use_cases/add/tasks.py +122 -0
  24. omnifocus_operator/contracts/use_cases/edit/__init__.py +22 -0
  25. omnifocus_operator/contracts/use_cases/edit/tasks.py +158 -0
  26. omnifocus_operator/contracts/use_cases/list/__init__.py +73 -0
  27. omnifocus_operator/contracts/use_cases/list/_date_filter.py +163 -0
  28. omnifocus_operator/contracts/use_cases/list/_enums.py +64 -0
  29. omnifocus_operator/contracts/use_cases/list/_validators.py +73 -0
  30. omnifocus_operator/contracts/use_cases/list/common.py +26 -0
  31. omnifocus_operator/contracts/use_cases/list/folders.py +64 -0
  32. omnifocus_operator/contracts/use_cases/list/perspectives.py +48 -0
  33. omnifocus_operator/contracts/use_cases/list/projects.py +144 -0
  34. omnifocus_operator/contracts/use_cases/list/tags.py +66 -0
  35. omnifocus_operator/contracts/use_cases/list/tasks.py +147 -0
  36. omnifocus_operator/middleware.py +165 -0
  37. omnifocus_operator/models/__init__.py +95 -0
  38. omnifocus_operator/models/base.py +28 -0
  39. omnifocus_operator/models/common.py +125 -0
  40. omnifocus_operator/models/enums.py +121 -0
  41. omnifocus_operator/models/folder.py +20 -0
  42. omnifocus_operator/models/perspective.py +28 -0
  43. omnifocus_operator/models/project.py +33 -0
  44. omnifocus_operator/models/repetition_rule.py +272 -0
  45. omnifocus_operator/models/snapshot.py +25 -0
  46. omnifocus_operator/models/tag.py +23 -0
  47. omnifocus_operator/models/task.py +60 -0
  48. omnifocus_operator/py.typed +0 -0
  49. omnifocus_operator/repository/__init__.py +21 -0
  50. omnifocus_operator/repository/bridge_only/__init__.py +5 -0
  51. omnifocus_operator/repository/bridge_only/adapter.py +433 -0
  52. omnifocus_operator/repository/bridge_only/bridge_only.py +369 -0
  53. omnifocus_operator/repository/bridge_write_mixin.py +50 -0
  54. omnifocus_operator/repository/factory.py +133 -0
  55. omnifocus_operator/repository/hybrid/__init__.py +5 -0
  56. omnifocus_operator/repository/hybrid/hybrid.py +1152 -0
  57. omnifocus_operator/repository/hybrid/query_builder.py +383 -0
  58. omnifocus_operator/repository/pagination.py +18 -0
  59. omnifocus_operator/repository/rrule/__init__.py +13 -0
  60. omnifocus_operator/repository/rrule/builder.py +161 -0
  61. omnifocus_operator/repository/rrule/parser.py +276 -0
  62. omnifocus_operator/repository/rrule/schedule.py +61 -0
  63. omnifocus_operator/repository/rrule/serialize.py +33 -0
  64. omnifocus_operator/server/__init__.py +31 -0
  65. omnifocus_operator/server/handlers.py +251 -0
  66. omnifocus_operator/server/lifespan.py +62 -0
  67. omnifocus_operator/server/projection.py +239 -0
  68. omnifocus_operator/service/__init__.py +5 -0
  69. omnifocus_operator/service/convert.py +48 -0
  70. omnifocus_operator/service/domain.py +1193 -0
  71. omnifocus_operator/service/errors.py +67 -0
  72. omnifocus_operator/service/fuzzy.py +36 -0
  73. omnifocus_operator/service/payload.py +118 -0
  74. omnifocus_operator/service/preferences.py +170 -0
  75. omnifocus_operator/service/resolve.py +291 -0
  76. omnifocus_operator/service/resolve_dates.py +340 -0
  77. omnifocus_operator/service/service.py +1018 -0
  78. omnifocus_operator/service/validate.py +35 -0
  79. omnifocus_operator/simulator/__init__.py +1 -0
  80. omnifocus_operator/simulator/__main__.py +182 -0
  81. omnifocus_operator/simulator/data.py +472 -0
  82. omnifocus_operator-1.4.dist-info/METADATA +212 -0
  83. omnifocus_operator-1.4.dist-info/RECORD +85 -0
  84. omnifocus_operator-1.4.dist-info/WHEEL +4 -0
  85. omnifocus_operator-1.4.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,5 @@
1
+ """OmniFocus Operator -- MCP server for OmniFocus task infrastructure."""
2
+
3
+ from importlib.metadata import version
4
+
5
+ __version__ = version("omnifocus-operator")
@@ -0,0 +1,65 @@
1
+ """Entry point for omnifocus-operator."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import os
7
+ import sys
8
+ from logging.handlers import RotatingFileHandler
9
+
10
+ from omnifocus_operator.config import get_settings
11
+ from omnifocus_operator.server import create_server
12
+
13
+
14
+ def _configure_logging() -> None:
15
+ """Configure root omnifocus_operator logger with dual handlers.
16
+
17
+ Handler 1: StreamHandler(stderr) -- visible in Claude Desktop log page.
18
+ Handler 2: RotatingFileHandler -- persistent fallback for Claude Code
19
+ where stderr is swallowed during tool execution.
20
+
21
+ See: https://github.com/anthropics/claude-code/issues/29035
22
+ The file handler may become redundant when that issue is resolved.
23
+ """
24
+ level = get_settings().log_level.upper()
25
+ root = logging.getLogger("omnifocus_operator")
26
+ root.setLevel(level)
27
+ root.propagate = False # Don't leak to Python root logger
28
+
29
+ fmt = "%(asctime)s %(levelname)-8s [%(name)s] %(message)s"
30
+
31
+ # Handler 1: stderr (Claude Desktop log page)
32
+ stderr_handler = logging.StreamHandler(sys.stderr)
33
+ stderr_handler.setFormatter(logging.Formatter(fmt, datefmt="%H:%M:%S"))
34
+ root.addHandler(stderr_handler)
35
+
36
+ # Handler 2: rotating file (persistent; fallback for Claude Code)
37
+ # Claude Code swallows stderr during tool execution:
38
+ # https://github.com/anthropics/claude-code/issues/29035
39
+ # This handler may become redundant when that issue is resolved.
40
+ log_path = os.path.expanduser("~/Library/Logs/omnifocus-operator.log")
41
+ os.makedirs(os.path.dirname(log_path), exist_ok=True)
42
+ file_handler = RotatingFileHandler(
43
+ log_path,
44
+ maxBytes=5_000_000,
45
+ backupCount=3,
46
+ )
47
+ file_handler.setFormatter(logging.Formatter(fmt))
48
+ root.addHandler(file_handler)
49
+
50
+
51
+ def main() -> None:
52
+ """Run the OmniFocus Operator MCP server."""
53
+ if sys.platform != "darwin":
54
+ sys.stderr.write(
55
+ "omnifocus-operator requires macOS (OmniFocus is macOS-only).\n"
56
+ "See https://github.com/HelloThisIsFlo/omnifocus-operator for details.\n"
57
+ )
58
+ sys.exit(1)
59
+ _configure_logging()
60
+ server = create_server()
61
+ server.run(transport="stdio")
62
+
63
+
64
+ if __name__ == "__main__":
65
+ main()
@@ -0,0 +1,24 @@
1
+ # file generated by vcs-versioning
2
+ # don't change, don't track in version control
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ "__version_tuple__",
8
+ "version",
9
+ "version_tuple",
10
+ "__commit_id__",
11
+ "commit_id",
12
+ ]
13
+
14
+ version: str
15
+ __version__: str
16
+ __version_tuple__: tuple[int | str, ...]
17
+ version_tuple: tuple[int | str, ...]
18
+ commit_id: str | None
19
+ __commit_id__: str | None
20
+
21
+ __version__ = version = '1.4'
22
+ __version_tuple__ = version_tuple = (1, 4)
23
+
24
+ __commit_id__ = commit_id = None
@@ -0,0 +1,10 @@
1
+ """Agent-facing messages -- warnings and errors centralized for audit and review.
2
+
3
+ Import from submodules for clarity, or from this package for convenience:
4
+ from omnifocus_operator.agent_messages.errors import TASK_NOT_FOUND
5
+ from omnifocus_operator.agent_messages import TASK_NOT_FOUND # also works
6
+ """
7
+
8
+ from omnifocus_operator.agent_messages.descriptions import * # noqa: F403
9
+ from omnifocus_operator.agent_messages.errors import * # noqa: F403
10
+ from omnifocus_operator.agent_messages.warnings import * # noqa: F403