sessionmemory 0.6.1__tar.gz → 0.7.0__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 (36) hide show
  1. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/PKG-INFO +6 -2
  2. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/README.md +5 -1
  3. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/pyproject.toml +1 -1
  4. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/pyproject.toml.orig +1 -1
  5. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/new.py +20 -1
  6. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/bootstrap.py +1 -1
  7. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/inject.py +5 -1
  8. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/paths.py +9 -1
  9. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/__init__.py +0 -0
  10. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/cli.py +0 -0
  11. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/__init__.py +0 -0
  12. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/_common.py +0 -0
  13. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/delete.py +0 -0
  14. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/doctor.py +0 -0
  15. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/export.py +0 -0
  16. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/init.py +0 -0
  17. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/inject.py +0 -0
  18. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/log.py +0 -0
  19. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/project.py +0 -0
  20. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/reindex.py +0 -0
  21. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/search.py +0 -0
  22. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/__init__.py +0 -0
  23. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/atomic.py +0 -0
  24. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/backlog.py +0 -0
  25. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/config.py +0 -0
  26. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/doctor.py +0 -0
  27. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/embed.py +0 -0
  28. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/export.py +0 -0
  29. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/field.py +0 -0
  30. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/fieldindex.py +0 -0
  31. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/frontmatter.py +0 -0
  32. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/gitinfo.py +0 -0
  33. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/ids.py +0 -0
  34. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/log.py +0 -0
  35. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/registry.py +0 -0
  36. {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/resolve.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sessionmemory
3
- Version: 0.6.1
3
+ Version: 0.7.0
4
4
  Summary: Durable memory for coding agents, one folder of searchable pages per project.
5
5
  Author: Nathaniel Landau
6
6
  Author-email: Nathaniel Landau <github@natelandau.com>
@@ -202,7 +202,7 @@ project holding four learnings, one spec, one plan, and two open backlog items:
202
202
  Durable memory for this project lives in a vault of markdown pages. Nothing below is
203
203
  loaded for you: the titles are what the vault holds, and each is one `sessionmemory search`
204
204
  away. The project's folder has `learnings/` and `logs/`, searched by meaning, beside
205
- `specs/` and `backlog.md`, which are ordinary files you Read and Edit.
205
+ `specs/`, `runbooks/`, and `backlog.md`, which are ordinary files you Read and Edit.
206
206
  `sessionmemory project --json` prints every path.
207
207
 
208
208
  - Before assuming nothing was written down, search: `sessionmemory search "<words>"`
@@ -225,6 +225,10 @@ away. The project's folder has `learnings/` and `logs/`, searched by meaning, be
225
225
  directory and read any spec whose name matches, so a decision already made is not
226
226
  made again. `sessionmemory new spec --title "..." --cwd .` creates one and prints its
227
227
  path. Edit it directly after that.
228
+ - Runbooks: `runbooks/` holds step-by-step procedures to follow by hand, such as
229
+ configuring a service, rotating a credential, or recovering from an outage.
230
+ Whenever you write one, create it with `sessionmemory new runbook --title "..." --cwd .`,
231
+ which prints its path, never in another folder or the repository.
228
232
  - Learnings are captured at session end, not by you mid-session. When the user asks
229
233
  to keep one now: `sessionmemory new learning --title "..." --summary "..." --cwd .`
230
234
  creates the page and prints the path to write prose into. Title and summary state
@@ -187,7 +187,7 @@ project holding four learnings, one spec, one plan, and two open backlog items:
187
187
  Durable memory for this project lives in a vault of markdown pages. Nothing below is
188
188
  loaded for you: the titles are what the vault holds, and each is one `sessionmemory search`
189
189
  away. The project's folder has `learnings/` and `logs/`, searched by meaning, beside
190
- `specs/` and `backlog.md`, which are ordinary files you Read and Edit.
190
+ `specs/`, `runbooks/`, and `backlog.md`, which are ordinary files you Read and Edit.
191
191
  `sessionmemory project --json` prints every path.
192
192
 
193
193
  - Before assuming nothing was written down, search: `sessionmemory search "<words>"`
@@ -210,6 +210,10 @@ away. The project's folder has `learnings/` and `logs/`, searched by meaning, be
210
210
  directory and read any spec whose name matches, so a decision already made is not
211
211
  made again. `sessionmemory new spec --title "..." --cwd .` creates one and prints its
212
212
  path. Edit it directly after that.
213
+ - Runbooks: `runbooks/` holds step-by-step procedures to follow by hand, such as
214
+ configuring a service, rotating a credential, or recovering from an outage.
215
+ Whenever you write one, create it with `sessionmemory new runbook --title "..." --cwd .`,
216
+ which prints its path, never in another folder or the repository.
213
217
  - Learnings are captured at session end, not by you mid-session. When the user asks
214
218
  to keep one now: `sessionmemory new learning --title "..." --summary "..." --cwd .`
215
219
  creates the page and prints the path to write prose into. Title and summary state
@@ -11,7 +11,7 @@ description = "Durable memory for coding agents, one folder of searchable pages
11
11
  name = "sessionmemory"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.13,<3.15"
14
- version = "0.6.1"
14
+ version = "0.7.0"
15
15
 
16
16
  [[project.authors]]
17
17
  name = "Nathaniel Landau"
@@ -12,7 +12,7 @@
12
12
  name = "sessionmemory"
13
13
  readme = "README.md"
14
14
  requires-python = ">=3.13,<3.15"
15
- version = "0.6.1"
15
+ version = "0.7.0"
16
16
 
17
17
  [project.scripts]
18
18
  sessionmemory = "sessionmemory.cli:main"
@@ -18,7 +18,9 @@ from sessionmemory.commands._common import (
18
18
  from sessionmemory.lib import backlog, field, paths
19
19
  from sessionmemory.lib.config import now, today
20
20
 
21
- app = typer.Typer(no_args_is_help=True, help="Create a learning, spec, plan, or backlog item.")
21
+ app = typer.Typer(
22
+ no_args_is_help=True, help="Create a learning, spec, plan, runbook, or backlog item."
23
+ )
22
24
 
23
25
  # Typer lists an Enum's members in --help and rejects anything else at parse time, so the
24
26
  # allowed sets are spelled once, in lib/backlog, and mirrored here as choices.
@@ -112,6 +114,23 @@ def new_plan(
112
114
  )
113
115
 
114
116
 
117
+ @app.command("runbook")
118
+ def new_runbook(
119
+ title: str = TITLE,
120
+ body: str = BODY,
121
+ body_file: Path | None = BODY_FILE,
122
+ cwd: Path | None = CWD,
123
+ *,
124
+ as_json: bool = JSON,
125
+ ) -> None:
126
+ """Create a runbook for this project."""
127
+ vault = require_vault()
128
+ slug = require_project(vault, cwd)
129
+ _new_document(
130
+ paths.runbooks_dir(vault, slug), title, resolve_body(body, body_file), as_json=as_json
131
+ )
132
+
133
+
115
134
  @app.command("backlog", help="Add one open item to this project's backlog.md.")
116
135
  def new_backlog(
117
136
  kind: Kind = KIND,
@@ -46,7 +46,7 @@ One folder per project under `projects/`. Inside each:
46
46
 
47
47
  - `learnings/` is a field: flat markdown pages, embedded and searchable.
48
48
  - `logs/` is a second field, one page per session, searched on request.
49
- - `specs/`, `plans/`, and `backlog.md` are plain files, never indexed.
49
+ - `specs/`, `plans/`, `runbooks/`, and `backlog.md` are plain files, never indexed.
50
50
  - `backlog.md` is the list of open items for the project, one line each, sized by
51
51
  effort and grouped by commit type.
52
52
 
@@ -68,7 +68,7 @@ GUIDANCE = """## Using this vault
68
68
  Durable memory for this project lives in a vault of markdown pages. Nothing below is
69
69
  loaded for you: the titles are what the vault holds, and each is one `{command} search`
70
70
  away. The project's folder has `learnings/` and `logs/`, searched by meaning, beside
71
- `specs/` and `backlog.md`, which are ordinary files you Read and Edit.
71
+ `specs/`, `runbooks/`, and `backlog.md`, which are ordinary files you Read and Edit.
72
72
  `{command} project --json` prints every path.
73
73
 
74
74
  - Before assuming nothing was written down, search: `{command} search "<words>"`
@@ -91,6 +91,10 @@ away. The project's folder has `learnings/` and `logs/`, searched by meaning, be
91
91
  directory and read any spec whose name matches, so a decision already made is not
92
92
  made again. `{command} new spec --title "..." --cwd .` creates one and prints its
93
93
  path. Edit it directly after that.
94
+ - Runbooks: `runbooks/` holds step-by-step procedures to follow by hand, such as
95
+ configuring a service, rotating a credential, or recovering from an outage.
96
+ Whenever you write one, create it with `{command} new runbook --title "..." --cwd .`,
97
+ which prints its path, never in another folder or the repository.
94
98
  - Learnings are captured at session end, not by you mid-session. When the user asks
95
99
  to keep one now: `{command} new learning --title "..." --summary "..." --cwd .`
96
100
  creates the page and prints the path to write prose into. Title and summary state
@@ -1,7 +1,8 @@
1
1
  """Where a project's files live inside the vault.
2
2
 
3
3
  `learnings/` and `logs/` are fields: flat directories of pages, each with its own
4
- index. `specs/`, `plans/`, and `backlog.md` sit beside them and are never indexed. A
4
+ index. `specs/`, `plans/`, `runbooks/`, and `backlog.md` sit beside them and are never
5
+ indexed. A
5
6
  project's files are found by its slug and nothing else; there is no global scope.
6
7
  """
7
8
 
@@ -19,6 +20,7 @@ LEARNINGS_DIR = "learnings"
19
20
  LOGS_DIR = "logs"
20
21
  SPECS_DIR = "specs"
21
22
  PLANS_DIR = "plans"
23
+ RUNBOOKS_DIR = "runbooks"
22
24
  BACKLOG_FILE = "backlog.md"
23
25
 
24
26
  FIELD_DIRS: tuple[str, ...] = (LEARNINGS_DIR, LOGS_DIR)
@@ -49,6 +51,11 @@ def plans_dir(vault: Path, slug: str) -> Path:
49
51
  return project_dir(vault, slug) / PLANS_DIR
50
52
 
51
53
 
54
+ def runbooks_dir(vault: Path, slug: str) -> Path:
55
+ """Return the project's runbooks folder."""
56
+ return project_dir(vault, slug) / RUNBOOKS_DIR
57
+
58
+
52
59
  def backlog_path(vault: Path, slug: str) -> Path:
53
60
  """Return the project's backlog checklist file."""
54
61
  return project_dir(vault, slug) / BACKLOG_FILE
@@ -65,6 +72,7 @@ def project_paths(vault: Path, slug: str) -> dict[str, str]:
65
72
  "logs": str(logs_dir(vault, slug)),
66
73
  "specs": str(specs_dir(vault, slug)),
67
74
  "plans": str(plans_dir(vault, slug)),
75
+ "runbooks": str(runbooks_dir(vault, slug)),
68
76
  "backlog": str(backlog_path(vault, slug)),
69
77
  }
70
78