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.
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/PKG-INFO +6 -2
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/README.md +5 -1
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/pyproject.toml +1 -1
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/pyproject.toml.orig +1 -1
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/new.py +20 -1
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/bootstrap.py +1 -1
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/inject.py +5 -1
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/paths.py +9 -1
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/__init__.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/cli.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/__init__.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/_common.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/delete.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/doctor.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/export.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/init.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/inject.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/log.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/project.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/reindex.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/commands/search.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/__init__.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/atomic.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/backlog.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/config.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/doctor.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/embed.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/export.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/field.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/fieldindex.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/frontmatter.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/gitinfo.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/ids.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/log.py +0 -0
- {sessionmemory-0.6.1 → sessionmemory-0.7.0}/src/sessionmemory/lib/registry.py +0 -0
- {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.
|
|
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
|
|
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
|
|
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.
|
|
14
|
+
version = "0.7.0"
|
|
15
15
|
|
|
16
16
|
[[project.authors]]
|
|
17
17
|
name = "Nathaniel Landau"
|
|
@@ -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(
|
|
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
|
|
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
|
|
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
|
|
|
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
|