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.
Files changed (49) hide show
  1. {obris_cli-0.6.1 → obris_cli-0.6.2}/PKG-INFO +1 -1
  2. {obris_cli-0.6.1 → obris_cli-0.6.2}/pyproject.toml +1 -1
  3. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/mapping.py +22 -6
  4. {obris_cli-0.6.1 → obris_cli-0.6.2}/uv.lock +1 -1
  5. {obris_cli-0.6.1 → obris_cli-0.6.2}/.claude/settings.local.json +0 -0
  6. {obris_cli-0.6.1 → obris_cli-0.6.2}/.gitignore +0 -0
  7. {obris_cli-0.6.1 → obris_cli-0.6.2}/README.md +0 -0
  8. {obris_cli-0.6.1 → obris_cli-0.6.2}/ruff.toml +0 -0
  9. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/__init__.py +0 -0
  10. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/api/__init__.py +0 -0
  11. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/api/client.py +0 -0
  12. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/api/knowledge.py +0 -0
  13. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/api/topics.py +0 -0
  14. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/assets/icon.png +0 -0
  15. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/auth/__init__.py +0 -0
  16. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/auth/session.py +0 -0
  17. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/cli.py +0 -0
  18. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/__init__.py +0 -0
  19. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/auth.py +0 -0
  20. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/env.py +0 -0
  21. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/knowledge.py +0 -0
  22. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/save.py +0 -0
  23. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/sync.py +0 -0
  24. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/sync_config.py +0 -0
  25. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/sync_conflicts.py +0 -0
  26. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/commands/topic.py +0 -0
  27. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/config.py +0 -0
  28. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/output.py +0 -0
  29. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/routes.py +0 -0
  30. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/__init__.py +0 -0
  31. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/commands.py +0 -0
  32. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/constants.py +0 -0
  33. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/__init__.py +0 -0
  34. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/filters.py +0 -0
  35. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/manifest.py +0 -0
  36. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/run.py +0 -0
  37. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/subtree.py +0 -0
  38. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/engine/tracked.py +0 -0
  39. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/exclusions.py +0 -0
  40. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/io.py +0 -0
  41. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/models.py +0 -0
  42. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/resolver.py +0 -0
  43. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/runner.py +0 -0
  44. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/scanner.py +0 -0
  45. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/sync/state.py +0 -0
  46. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/utils/__init__.py +0 -0
  47. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/utils/capture.py +0 -0
  48. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/utils/notify.py +0 -0
  49. {obris_cli-0.6.1 → obris_cli-0.6.2}/src/obris/utils/upload.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: obris-cli
3
- Version: 0.6.1
3
+ Version: 0.6.2
4
4
  Summary: Save, organize, and access your knowledge from the command line
5
5
  Project-URL: Homepage, https://obris.ai
6
6
  Project-URL: Repository, https://github.com/obris-dev/obris
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "obris-cli"
3
- version = "0.6.1"
3
+ version = "0.6.2"
4
4
  description = "Save, organize, and access your knowledge from the command line"
5
5
 
6
6
  requires-python = ">=3.10"
@@ -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
- Strips path separators (prevents traversal), drops Windows-hostile
122
- trailing chars, preserves unicode/spaces, no case-folding. Returns
123
- "untitled" if the name slugifies away to nothing.
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 = (name or "").strip()
136
+ name = name or ""
126
137
  name = name.translate(_PATH_SEP_TRANSLATE)
127
- name = Path(name).name # defense-in-depth against any remaining traversal
128
- name = name.strip(" .")
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
 
@@ -141,7 +141,7 @@ wheels = [
141
141
 
142
142
  [[package]]
143
143
  name = "obris-cli"
144
- version = "0.6.1"
144
+ version = "0.6.2"
145
145
  source = { editable = "." }
146
146
  dependencies = [
147
147
  { name = "click" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes