imap-agent-cli 0.1.2__tar.gz → 0.1.3__tar.gz
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.
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/PKG-INFO +5 -5
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/README.md +4 -4
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/pyproject.toml +1 -1
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/__init__.py +1 -1
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/skill.py +14 -15
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/tests/test_skill.py +8 -1
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/.github/workflows/publish.yml +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/.gitignore +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/LICENSE +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/imap_agent_cli.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/spec.md +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/cli.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/config.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/errors.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/imap_client.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/mime.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/models.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/render.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/src/imap_agent_cli/search.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/tests/__init__.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/tests/_bootstrap.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/tests/pymap_server_runner.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/tests/test_cli.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/tests/test_config.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/tests/test_mime.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/tests/test_pymap_integration.py +0 -0
- {imap_agent_cli-0.1.2 → imap_agent_cli-0.1.3}/tests/test_search.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: imap-agent-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: Agent-first IMAP CLI for safe email search, read, attachment download, and draft creation
|
|
5
5
|
Project-URL: Homepage, https://github.com/pseudosavant/imap-agent-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/pseudosavant/imap-agent-cli
|
|
@@ -74,7 +74,7 @@ imap-agent-cli folders
|
|
|
74
74
|
imap-agent-cli search --folder INBOX --subject "invoice" --max-results 10
|
|
75
75
|
imap-agent-cli read --folder INBOX --uid 12345 --body-format html
|
|
76
76
|
imap-agent-cli attachments --folder INBOX --uid 12345
|
|
77
|
-
imap-agent-cli attachments download --folder INBOX --uid 12345 --part-id 2 --output-dir
|
|
77
|
+
imap-agent-cli attachments download --folder INBOX --uid 12345 --part-id 2 --output-dir ./email-attachments
|
|
78
78
|
imap-agent-cli draft create --to person@example.com --subject "Hello" --body "Draft only."
|
|
79
79
|
imap-agent-cli draft reply --folder INBOX --uid 12345 --body "Thanks. I will review this."
|
|
80
80
|
```
|
|
@@ -104,9 +104,9 @@ Config path:
|
|
|
104
104
|
|
|
105
105
|
Secrets should stay in environment variables, not the config file.
|
|
106
106
|
|
|
107
|
-
##
|
|
107
|
+
## Agent Skill
|
|
108
108
|
|
|
109
|
-
Install or update the user-scoped
|
|
109
|
+
Install or update the user-scoped `imap` skill:
|
|
110
110
|
|
|
111
111
|
```text
|
|
112
112
|
imap-agent-cli install-skill
|
|
@@ -127,7 +127,7 @@ imap-agent-cli remove-skill
|
|
|
127
127
|
Use `--skills-dir PATH` to install into a nonstandard skills directory, for example:
|
|
128
128
|
|
|
129
129
|
```text
|
|
130
|
-
imap-agent-cli install-skill --skills-dir
|
|
130
|
+
imap-agent-cli install-skill --skills-dir ~/.agents/skills
|
|
131
131
|
```
|
|
132
132
|
|
|
133
133
|
## Safety Boundary
|
|
@@ -41,7 +41,7 @@ imap-agent-cli folders
|
|
|
41
41
|
imap-agent-cli search --folder INBOX --subject "invoice" --max-results 10
|
|
42
42
|
imap-agent-cli read --folder INBOX --uid 12345 --body-format html
|
|
43
43
|
imap-agent-cli attachments --folder INBOX --uid 12345
|
|
44
|
-
imap-agent-cli attachments download --folder INBOX --uid 12345 --part-id 2 --output-dir
|
|
44
|
+
imap-agent-cli attachments download --folder INBOX --uid 12345 --part-id 2 --output-dir ./email-attachments
|
|
45
45
|
imap-agent-cli draft create --to person@example.com --subject "Hello" --body "Draft only."
|
|
46
46
|
imap-agent-cli draft reply --folder INBOX --uid 12345 --body "Thanks. I will review this."
|
|
47
47
|
```
|
|
@@ -71,9 +71,9 @@ Config path:
|
|
|
71
71
|
|
|
72
72
|
Secrets should stay in environment variables, not the config file.
|
|
73
73
|
|
|
74
|
-
##
|
|
74
|
+
## Agent Skill
|
|
75
75
|
|
|
76
|
-
Install or update the user-scoped
|
|
76
|
+
Install or update the user-scoped `imap` skill:
|
|
77
77
|
|
|
78
78
|
```text
|
|
79
79
|
imap-agent-cli install-skill
|
|
@@ -94,7 +94,7 @@ imap-agent-cli remove-skill
|
|
|
94
94
|
Use `--skills-dir PATH` to install into a nonstandard skills directory, for example:
|
|
95
95
|
|
|
96
96
|
```text
|
|
97
|
-
imap-agent-cli install-skill --skills-dir
|
|
97
|
+
imap-agent-cli install-skill --skills-dir ~/.agents/skills
|
|
98
98
|
```
|
|
99
99
|
|
|
100
100
|
## Safety Boundary
|
|
@@ -13,7 +13,7 @@ MANAGED_MARKER = "<!-- managed-by: imap-agent-cli -->"
|
|
|
13
13
|
|
|
14
14
|
SKILL_MD = f"""---
|
|
15
15
|
name: imap
|
|
16
|
-
description: Use when the user asks
|
|
16
|
+
description: Use when the user asks an agentic tool to search, read, summarize, inspect, or draft email using imap-agent-cli. Covers safe IMAP-only email access, folder enumeration, attachment download, and draft creation; must not send, delete, move, archive, flag, label, or mark messages read/unread.
|
|
17
17
|
---
|
|
18
18
|
|
|
19
19
|
{MANAGED_MARKER}
|
|
@@ -37,14 +37,13 @@ Use `imap-agent-cli` for safe agentic email workflows over IMAP. The tool can se
|
|
|
37
37
|
|
|
38
38
|
Prefer the published CLI:
|
|
39
39
|
|
|
40
|
-
```
|
|
41
|
-
$env:UV_LINK_MODE = "copy"
|
|
40
|
+
```text
|
|
42
41
|
uvx --refresh-package imap-agent-cli imap-agent-cli <command>
|
|
43
42
|
```
|
|
44
43
|
|
|
45
44
|
If working inside the `imap-agent-cli` repository, this local form is also valid:
|
|
46
45
|
|
|
47
|
-
```
|
|
46
|
+
```text
|
|
48
47
|
uv run ./imap_agent_cli.py <command>
|
|
49
48
|
```
|
|
50
49
|
|
|
@@ -63,7 +62,7 @@ IMAP_AGENT_CLI_DRAFTS_FOLDER
|
|
|
63
62
|
|
|
64
63
|
Use this to discover folder names and Drafts naming:
|
|
65
64
|
|
|
66
|
-
```
|
|
65
|
+
```text
|
|
67
66
|
uvx --refresh-package imap-agent-cli imap-agent-cli folders
|
|
68
67
|
```
|
|
69
68
|
|
|
@@ -73,7 +72,7 @@ Return only relevant folder names/counts to the user unless they ask for the ful
|
|
|
73
72
|
|
|
74
73
|
Search defaults to `INBOX` when no folder is provided:
|
|
75
74
|
|
|
76
|
-
```
|
|
75
|
+
```text
|
|
77
76
|
uvx --refresh-package imap-agent-cli imap-agent-cli search --folder INBOX --max-results 10
|
|
78
77
|
uvx --refresh-package imap-agent-cli imap-agent-cli search --folder INBOX --subject "invoice" --max-results 10
|
|
79
78
|
uvx --refresh-package imap-agent-cli imap-agent-cli search --folder INBOX --from "Justin" --max-results 10
|
|
@@ -84,13 +83,13 @@ If a server-side `--from` search times out, enumerate recent messages with a bou
|
|
|
84
83
|
|
|
85
84
|
For child folders:
|
|
86
85
|
|
|
87
|
-
```
|
|
86
|
+
```text
|
|
88
87
|
uvx --refresh-package imap-agent-cli imap-agent-cli search --folder Projects --recursive --max-results 25
|
|
89
88
|
```
|
|
90
89
|
|
|
91
90
|
For all folders, use sparingly because large mailboxes can be slow:
|
|
92
91
|
|
|
93
|
-
```
|
|
92
|
+
```text
|
|
94
93
|
uvx --refresh-package imap-agent-cli imap-agent-cli search --all-folders --subject "contract" --max-results 25
|
|
95
94
|
```
|
|
96
95
|
|
|
@@ -98,7 +97,7 @@ uvx --refresh-package imap-agent-cli imap-agent-cli search --all-folders --subje
|
|
|
98
97
|
|
|
99
98
|
Read a message by folder and UID from search results:
|
|
100
99
|
|
|
101
|
-
```
|
|
100
|
+
```text
|
|
102
101
|
uvx --refresh-package imap-agent-cli imap-agent-cli read --folder INBOX --uid 12345 --body-format metadata
|
|
103
102
|
uvx --refresh-package imap-agent-cli imap-agent-cli read --folder INBOX --uid 12345 --body-format plain --max-body-chars 12000
|
|
104
103
|
uvx --refresh-package imap-agent-cli imap-agent-cli read --folder INBOX --uid 12345 --body-format html
|
|
@@ -110,15 +109,15 @@ Use `metadata` first when confirming identity, attachments, or headers. Use `pla
|
|
|
110
109
|
|
|
111
110
|
List attachment metadata:
|
|
112
111
|
|
|
113
|
-
```
|
|
112
|
+
```text
|
|
114
113
|
uvx --refresh-package imap-agent-cli imap-agent-cli attachments --folder INBOX --uid 12345
|
|
115
114
|
```
|
|
116
115
|
|
|
117
116
|
Download requires an explicit output directory:
|
|
118
117
|
|
|
119
|
-
```
|
|
120
|
-
uvx --refresh-package imap-agent-cli imap-agent-cli attachments download --folder INBOX --uid 12345 --part-id 1 --output-dir
|
|
121
|
-
uvx --refresh-package imap-agent-cli imap-agent-cli attachments download --folder INBOX --uid 12345 --all --output-dir
|
|
118
|
+
```text
|
|
119
|
+
uvx --refresh-package imap-agent-cli imap-agent-cli attachments download --folder INBOX --uid 12345 --part-id 1 --output-dir ./email-attachments
|
|
120
|
+
uvx --refresh-package imap-agent-cli imap-agent-cli attachments download --folder INBOX --uid 12345 --all --output-dir ./email-attachments
|
|
122
121
|
```
|
|
123
122
|
|
|
124
123
|
Report saved paths to the user.
|
|
@@ -127,13 +126,13 @@ Report saved paths to the user.
|
|
|
127
126
|
|
|
128
127
|
Create a new draft:
|
|
129
128
|
|
|
130
|
-
```
|
|
129
|
+
```text
|
|
131
130
|
uvx --refresh-package imap-agent-cli imap-agent-cli draft create --to person@example.com --subject "Subject" --body "Draft body"
|
|
132
131
|
```
|
|
133
132
|
|
|
134
133
|
Create a reply draft from an existing message:
|
|
135
134
|
|
|
136
|
-
```
|
|
135
|
+
```text
|
|
137
136
|
uvx --refresh-package imap-agent-cli imap-agent-cli draft reply --folder INBOX --uid 12345 --body "Draft reply body"
|
|
138
137
|
```
|
|
139
138
|
|
|
@@ -11,7 +11,7 @@ from tests import _bootstrap # noqa: F401
|
|
|
11
11
|
|
|
12
12
|
from imap_agent_cli.cli import main
|
|
13
13
|
from imap_agent_cli.errors import AppError
|
|
14
|
-
from imap_agent_cli.skill import MANAGED_MARKER, install_skill, remove_skill
|
|
14
|
+
from imap_agent_cli.skill import MANAGED_MARKER, SKILL_MD, install_skill, remove_skill
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class SkillTests(unittest.TestCase):
|
|
@@ -32,6 +32,13 @@ class SkillTests(unittest.TestCase):
|
|
|
32
32
|
self.assertTrue(second["installed"])
|
|
33
33
|
self.assertFalse(second["updated"])
|
|
34
34
|
|
|
35
|
+
def test_skill_text_is_platform_and_agent_neutral(self) -> None:
|
|
36
|
+
self.assertIn("agentic tool", SKILL_MD)
|
|
37
|
+
self.assertNotIn("Codex", SKILL_MD)
|
|
38
|
+
self.assertNotIn("powershell", SKILL_MD.lower())
|
|
39
|
+
self.assertNotIn("UV_LINK_MODE", SKILL_MD)
|
|
40
|
+
self.assertNotIn("C:\\tmp", SKILL_MD)
|
|
41
|
+
|
|
35
42
|
def test_remove_skill_removes_only_managed_skill(self) -> None:
|
|
36
43
|
with tempfile.TemporaryDirectory() as tmp:
|
|
37
44
|
root = Path(tmp)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|