obris-cli 0.6.1__tar.gz → 0.6.2__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.
- {obris_cli-0.6.1 → obris_cli-0.6.2}/PKG-INFO +1 -1
- {obris_cli-0.6.1 → obris_cli-0.6.2}/pyproject.toml +1 -1
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/mapping.py +22 -6
- {obris_cli-0.6.1 → obris_cli-0.6.2}/uv.lock +1 -1
- {obris_cli-0.6.1 → obris_cli-0.6.2}/.claude/settings.local.json +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/.gitignore +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/README.md +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/ruff.toml +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/__init__.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/api/__init__.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/api/client.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/api/knowledge.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/api/topics.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/assets/icon.png +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/auth/__init__.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/auth/session.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/cli.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/__init__.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/auth.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/env.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/knowledge.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/save.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/sync.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/sync_config.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/sync_conflicts.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/topic.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/config.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/output.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/routes.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/__init__.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/commands.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/constants.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/__init__.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/filters.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/manifest.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/run.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/subtree.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/tracked.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/exclusions.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/io.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/models.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/resolver.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/runner.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/scanner.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/state.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/utils/__init__.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/utils/capture.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/utils/notify.py +0 -0
- {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/utils/upload.py +0 -0
|
@@ -118,14 +118,30 @@ _PATH_SEP_TRANSLATE = str.maketrans({"/": "-", "\\": "-"})
|
|
|
118
118
|
def slugify_topic_name(name: str) -> str:
|
|
119
119
|
"""Convert a topic name into a safe directory component.
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
Translates path separators to dashes — actual traversal defense, not
|
|
122
|
+
aesthetics — and bottoms out at "untitled" when the name leaves
|
|
123
|
+
nothing safe to use (empty, ``.``, or ``..``). Otherwise the topic
|
|
124
|
+
name passes through unchanged: leading dots, trailing dots, leading
|
|
125
|
+
or trailing whitespace, unicode, case — all preserved.
|
|
126
|
+
|
|
127
|
+
Why so minimal: if a topic was created with a particular name (via
|
|
128
|
+
the CLI itself, the web app, or an MCP tool), that name *is* the
|
|
129
|
+
user's intent. Stripping leading dots silently renames ``.claude/``
|
|
130
|
+
to ``claude/`` on first sync; stripping trailing dots breaks
|
|
131
|
+
``foo./``; trimming whitespace breaks ``" intentional "``.
|
|
132
|
+
Cross-platform pain (Windows-hostile trailing dots, APFS case
|
|
133
|
+
folding) is addressed when it actually comes up, not pre-emptively
|
|
134
|
+
at the cost of common AI-tool config dirs.
|
|
124
135
|
"""
|
|
125
|
-
name =
|
|
136
|
+
name = name or ""
|
|
126
137
|
name = name.translate(_PATH_SEP_TRANSLATE)
|
|
127
|
-
name = Path(name).name #
|
|
128
|
-
name
|
|
138
|
+
name = Path(name).name # blocks `.` and leftover `/foo` traversal
|
|
139
|
+
# ``Path("..").name`` keeps ``..`` verbatim (POSIX quirk: it's a
|
|
140
|
+
# legal path component, just dangerous as a directory name).
|
|
141
|
+
# Catch it explicitly so a topic named ``..`` doesn't materialize
|
|
142
|
+
# as the parent directory at sync time.
|
|
143
|
+
if name == "..":
|
|
144
|
+
name = ""
|
|
129
145
|
return name or "untitled"
|
|
130
146
|
|
|
131
147
|
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|