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.
- omnifocus_operator/__init__.py +5 -0
- omnifocus_operator/__main__.py +65 -0
- omnifocus_operator/_version.py +24 -0
- omnifocus_operator/agent_messages/__init__.py +10 -0
- omnifocus_operator/agent_messages/descriptions.py +594 -0
- omnifocus_operator/agent_messages/errors.py +221 -0
- omnifocus_operator/agent_messages/warnings.py +194 -0
- omnifocus_operator/bridge/__init__.py +33 -0
- omnifocus_operator/bridge/bridge.js +464 -0
- omnifocus_operator/bridge/errors.py +79 -0
- omnifocus_operator/bridge/mtime.py +47 -0
- omnifocus_operator/bridge/real.py +296 -0
- omnifocus_operator/config.py +200 -0
- omnifocus_operator/contracts/__init__.py +176 -0
- omnifocus_operator/contracts/base.py +110 -0
- omnifocus_operator/contracts/protocols.py +121 -0
- omnifocus_operator/contracts/shared/__init__.py +0 -0
- omnifocus_operator/contracts/shared/actions.py +125 -0
- omnifocus_operator/contracts/shared/dates.py +21 -0
- omnifocus_operator/contracts/shared/repetition_rule.py +262 -0
- omnifocus_operator/contracts/use_cases/__init__.py +0 -0
- omnifocus_operator/contracts/use_cases/add/__init__.py +18 -0
- omnifocus_operator/contracts/use_cases/add/tasks.py +122 -0
- omnifocus_operator/contracts/use_cases/edit/__init__.py +22 -0
- omnifocus_operator/contracts/use_cases/edit/tasks.py +158 -0
- omnifocus_operator/contracts/use_cases/list/__init__.py +73 -0
- omnifocus_operator/contracts/use_cases/list/_date_filter.py +163 -0
- omnifocus_operator/contracts/use_cases/list/_enums.py +64 -0
- omnifocus_operator/contracts/use_cases/list/_validators.py +73 -0
- omnifocus_operator/contracts/use_cases/list/common.py +26 -0
- omnifocus_operator/contracts/use_cases/list/folders.py +64 -0
- omnifocus_operator/contracts/use_cases/list/perspectives.py +48 -0
- omnifocus_operator/contracts/use_cases/list/projects.py +144 -0
- omnifocus_operator/contracts/use_cases/list/tags.py +66 -0
- omnifocus_operator/contracts/use_cases/list/tasks.py +147 -0
- omnifocus_operator/middleware.py +165 -0
- omnifocus_operator/models/__init__.py +95 -0
- omnifocus_operator/models/base.py +28 -0
- omnifocus_operator/models/common.py +125 -0
- omnifocus_operator/models/enums.py +121 -0
- omnifocus_operator/models/folder.py +20 -0
- omnifocus_operator/models/perspective.py +28 -0
- omnifocus_operator/models/project.py +33 -0
- omnifocus_operator/models/repetition_rule.py +272 -0
- omnifocus_operator/models/snapshot.py +25 -0
- omnifocus_operator/models/tag.py +23 -0
- omnifocus_operator/models/task.py +60 -0
- omnifocus_operator/py.typed +0 -0
- omnifocus_operator/repository/__init__.py +21 -0
- omnifocus_operator/repository/bridge_only/__init__.py +5 -0
- omnifocus_operator/repository/bridge_only/adapter.py +433 -0
- omnifocus_operator/repository/bridge_only/bridge_only.py +369 -0
- omnifocus_operator/repository/bridge_write_mixin.py +50 -0
- omnifocus_operator/repository/factory.py +133 -0
- omnifocus_operator/repository/hybrid/__init__.py +5 -0
- omnifocus_operator/repository/hybrid/hybrid.py +1152 -0
- omnifocus_operator/repository/hybrid/query_builder.py +383 -0
- omnifocus_operator/repository/pagination.py +18 -0
- omnifocus_operator/repository/rrule/__init__.py +13 -0
- omnifocus_operator/repository/rrule/builder.py +161 -0
- omnifocus_operator/repository/rrule/parser.py +276 -0
- omnifocus_operator/repository/rrule/schedule.py +61 -0
- omnifocus_operator/repository/rrule/serialize.py +33 -0
- omnifocus_operator/server/__init__.py +31 -0
- omnifocus_operator/server/handlers.py +251 -0
- omnifocus_operator/server/lifespan.py +62 -0
- omnifocus_operator/server/projection.py +239 -0
- omnifocus_operator/service/__init__.py +5 -0
- omnifocus_operator/service/convert.py +48 -0
- omnifocus_operator/service/domain.py +1193 -0
- omnifocus_operator/service/errors.py +67 -0
- omnifocus_operator/service/fuzzy.py +36 -0
- omnifocus_operator/service/payload.py +118 -0
- omnifocus_operator/service/preferences.py +170 -0
- omnifocus_operator/service/resolve.py +291 -0
- omnifocus_operator/service/resolve_dates.py +340 -0
- omnifocus_operator/service/service.py +1018 -0
- omnifocus_operator/service/validate.py +35 -0
- omnifocus_operator/simulator/__init__.py +1 -0
- omnifocus_operator/simulator/__main__.py +182 -0
- omnifocus_operator/simulator/data.py +472 -0
- omnifocus_operator-1.4.dist-info/METADATA +212 -0
- omnifocus_operator-1.4.dist-info/RECORD +85 -0
- omnifocus_operator-1.4.dist-info/WHEEL +4 -0
- omnifocus_operator-1.4.dist-info/entry_points.txt +2 -0
|
@@ -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
|