remcycle 0.3.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 (37) hide show
  1. remcycle-0.3.0/.gitignore +6 -0
  2. remcycle-0.3.0/CHANGELOG.md +39 -0
  3. remcycle-0.3.0/LICENSE +177 -0
  4. remcycle-0.3.0/NOTICE +2 -0
  5. remcycle-0.3.0/PKG-INFO +169 -0
  6. remcycle-0.3.0/pyproject.toml +62 -0
  7. remcycle-0.3.0/src/dream/__init__.py +0 -0
  8. remcycle-0.3.0/src/dream/archive.py +406 -0
  9. remcycle-0.3.0/src/dream/claims.py +102 -0
  10. remcycle-0.3.0/src/dream/cli.py +596 -0
  11. remcycle-0.3.0/src/dream/daily.py +105 -0
  12. remcycle-0.3.0/src/dream/dreaming.py +492 -0
  13. remcycle-0.3.0/src/dream/extract.py +462 -0
  14. remcycle-0.3.0/src/dream/gate.py +135 -0
  15. remcycle-0.3.0/src/dream/memory.py +736 -0
  16. remcycle-0.3.0/src/dream/mirror.py +150 -0
  17. remcycle-0.3.0/src/dream/outside.py +175 -0
  18. remcycle-0.3.0/src/dream/reconcile.py +199 -0
  19. remcycle-0.3.0/src/dream/redact.py +38 -0
  20. remcycle-0.3.0/src/dream/review.py +194 -0
  21. remcycle-0.3.0/src/dream/session.py +153 -0
  22. remcycle-0.3.0/src/dream/settings.py +122 -0
  23. remcycle-0.3.0/src/dream/transcript.py +177 -0
  24. remcycle-0.3.0/tests/support.py +70 -0
  25. remcycle-0.3.0/tests/test_archive.py +468 -0
  26. remcycle-0.3.0/tests/test_cli.py +498 -0
  27. remcycle-0.3.0/tests/test_daily.py +34 -0
  28. remcycle-0.3.0/tests/test_dreaming.py +755 -0
  29. remcycle-0.3.0/tests/test_extract.py +169 -0
  30. remcycle-0.3.0/tests/test_gate.py +148 -0
  31. remcycle-0.3.0/tests/test_memory.py +602 -0
  32. remcycle-0.3.0/tests/test_outside.py +149 -0
  33. remcycle-0.3.0/tests/test_reconcile.py +149 -0
  34. remcycle-0.3.0/tests/test_release.py +36 -0
  35. remcycle-0.3.0/tests/test_review.py +145 -0
  36. remcycle-0.3.0/tests/test_settings.py +87 -0
  37. remcycle-0.3.0/tests/test_transcript.py +208 -0
@@ -0,0 +1,6 @@
1
+ .venv/
2
+ __pycache__/
3
+ .pytest_cache/
4
+ *.db
5
+ .local/
6
+ mod/.claude/
@@ -0,0 +1,39 @@
1
+ # Changelog
2
+
3
+ ## 0.3.0
4
+
5
+ - **remcycle is on PyPI.** `uv tool install remcycle` installs the `dream` command, and `uv tool upgrade remcycle` brings the latest release.
6
+ - **The mod follows releases.** It is installed from the tag of the latest release, so `claude plugin update remcycle@remcycle` brings a release and nothing in between.
7
+ - **`dream --version`** says which version of the command is installed.
8
+
9
+ ### Upgrading from 0.2.0 or earlier
10
+
11
+ The command you have follows the repository, not releases. Replace it once, and update the mod:
12
+
13
+ ```bash
14
+ uv tool install --reinstall remcycle
15
+ claude plugin update remcycle@remcycle
16
+ ```
17
+
18
+ If Claude set remcycle up for you from a folder such as `~/remcycle`, the mod was installed from that folder as well. Move it to the repository on GitHub, after which the folder can be deleted:
19
+
20
+ ```bash
21
+ claude plugin marketplace remove remcycle
22
+ claude plugin marketplace add lianmatsuo/remcycle
23
+ claude plugin install remcycle@remcycle
24
+ ```
25
+
26
+ ## 0.2.0
27
+
28
+ - **The daily dream is on by default.** Once a day, the first session after 20 hours starts the dream in the background, with no scheduler to set up. The panel asks once how much history it should read, shows when it last ran and why it went wrong if it did, and turns it off. `dream daily` makes the same changes from the command line.
29
+ - **Memory stays free while a dream reads.** The model reads the sessions before the dream takes its turn at changing memory, so closing a thread or ruling on a question during a run works, and a close that does collide says to try again.
30
+ - **Lighter model calls.** The dream's calls to Claude Code no longer carry the descriptions of your MCP servers and skills. One measured call went from about 183,000 tokens of context to about 500.
31
+
32
+ ## 0.1.0
33
+
34
+ The first public release.
35
+
36
+ - **The archive.** `dream ingest`, `search`, `show` and `purge`. Every session's prose is kept word for word in one local file, with secrets redacted and the projects you exclude left out.
37
+ - **The dream.** `dream run` reads new sessions through your own Claude Code, keeps what you said or agreed to together with the words it came from, and checks every change before accepting it. `dream review` goes over the memories you already had. `dream publish` writes to the memory Claude Code itself loads, and only when you ask.
38
+ - **The mod.** It hands each new session what was learned and what was left unfinished, gives Claude the `recall`, `close_thread` and `settle_memory` tools, and adds the `/remcycle` panel.
39
+ - **Setup by Claude.** One prompt to paste. Claude does the install and stops for a yes before anything that costs model usage or changes how Claude Code runs.
remcycle-0.3.0/LICENSE ADDED
@@ -0,0 +1,177 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
remcycle-0.3.0/NOTICE ADDED
@@ -0,0 +1,2 @@
1
+ remcycle
2
+ Copyright 2026 Lian Matsuo
@@ -0,0 +1,169 @@
1
+ Metadata-Version: 2.5
2
+ Name: remcycle
3
+ Version: 0.3.0
4
+ Summary: Garbage collection for Claude Code's memory: rereads your sessions every day, keeps what you decided, and questions stale notes
5
+ Project-URL: Homepage, https://github.com/lianmatsuo/remcycle
6
+ Project-URL: Changelog, https://github.com/lianmatsuo/remcycle/blob/main/CHANGELOG.md
7
+ Project-URL: Issues, https://github.com/lianmatsuo/remcycle/issues
8
+ Author: Lian Matsuo
9
+ License-Expression: Apache-2.0
10
+ License-File: LICENSE
11
+ License-File: NOTICE
12
+ Requires-Python: >=3.12
13
+ Description-Content-Type: text/markdown
14
+
15
+ <p align="center">
16
+ <img src="https://raw.githubusercontent.com/lianmatsuo/remcycle/main/docs/images/header.png" alt="remcycle. Garbage collection for Claude Code's memory. A mod that rereads your sessions every day, keeps what you decided, and questions the notes that have gone stale." width="100%">
17
+ </p>
18
+
19
+ <p align="center">
20
+ <a href="https://github.com/lianmatsuo/remcycle/actions/workflows/check.yml"><img src="https://github.com/lianmatsuo/remcycle/actions/workflows/check.yml/badge.svg" alt="Checks"></a>
21
+ <a href="https://github.com/lianmatsuo/remcycle/blob/main/LICENSE"><img src="https://img.shields.io/badge/licence-Apache--2.0-555" alt="Licence: Apache-2.0"></a>
22
+ <img src="https://img.shields.io/badge/Claude%20Code-2.1.287%20or%20later-555" alt="Needs Claude Code 2.1.287 or later">
23
+ </p>
24
+
25
+ <p align="center">
26
+ <img src="https://raw.githubusercontent.com/lianmatsuo/remcycle/main/docs/images/session.webp" alt="A Claude Code session with the remcycle panel beside it. The panel shows two questions waiting for a ruling, nine memories and where they came from, what was learned lately, and what earlier sessions left open." width="100%">
27
+ </p>
28
+
29
+ <p align="center"><sub>The shop project in the pictures is made up.</sub></p>
30
+
31
+ Claude Code starts every session fresh, and the notes it keeps about your projects pile up until the old ones are wrong. remcycle keeps everything you and Claude said, and once a day it reads the new sessions in the background, keeps what you actually decided, and questions the rest. The sessions after that start knowing it.
32
+
33
+ - **Sessions that start informed.** Each new session is handed what you have said applies to all your work, what was learned about the project, and what earlier sessions left unfinished.
34
+ - **Memory you can trust.** Every memory points at the words it came from. Something only Claude concluded is never loaded as if you had said it, and a note you already had is never replaced without asking you.
35
+ - **A list that stays short.** Stale, repeated and contradictory notes are found and put to you, so what loads at the start of a session does not keep growing.
36
+ - **Recall.** Claude can search everything that was said in past sessions, get a summary of any the dream has read, and read the exact words back when it needs them.
37
+ - **Everything on your machine.** The archive is one local file. The only thing that leaves is what the dream sends to the model, through your own Claude Code.
38
+
39
+ ## Get started
40
+
41
+ You need [Claude Code](https://claude.com/claude-code) 2.1.287 or later and [uv](https://docs.astral.sh/uv/).
42
+
43
+ ```bash
44
+ uv tool install remcycle
45
+ claude plugin marketplace add lianmatsuo/remcycle
46
+ claude plugin install remcycle@remcycle
47
+ ```
48
+
49
+ The first line installs the `dream` command, and the other two install the mod. Then:
50
+
51
+ 1. **Say what it should never read.** A client's or an employer's projects go in [the settings file](https://github.com/lianmatsuo/remcycle/blob/main/docs/reference.md#settings) before anything else, because the dream starts reading by itself.
52
+ 2. **Build the archive.** `dream ingest` copies what was said in your past sessions into one local file. It sends nothing anywhere.
53
+ 3. **Open the panel.** Start a new session and type `/remcycle`. It asks once how much of your history the daily dream should read: only new sessions, the week before too, or everything.
54
+
55
+ From then on the dream runs by itself. Once a day, the first session after 20 hours starts it in the background, and it reads the sessions that are new. This is the part that uses your Claude plan: one long session came to about $0.60 at API prices. `dream daily off`, or the switch in the panel, turns it off, and `dream run` runs it at any time. [The daily dream](https://github.com/lianmatsuo/remcycle/blob/main/docs/schedule.md) has its settings, and how to run it at a fixed time instead.
56
+
57
+ ### Or let Claude set it up
58
+
59
+ Paste this into Claude Code:
60
+
61
+ ```text
62
+ Set up remcycle for me. Clone https://github.com/lianmatsuo/remcycle into ~/remcycle, or run git pull there if it is already cloned. Then read docs/setup-with-claude.md in that folder and follow it step by step.
63
+ ```
64
+
65
+ Claude installs the command, asks which projects to leave out, and builds the archive. It asks you before loading the mod in every session, which also starts the daily dream, and asks how much of your history that dream should read. You can say no to either and turn it on later.
66
+
67
+ The folder is only read for its guide, and can be deleted afterwards. [Removing it](https://github.com/lianmatsuo/remcycle/blob/main/docs/reference.md#removing-it) says how to undo each part.
68
+
69
+ ## The panel
70
+
71
+ <p align="center">
72
+ <img src="https://raw.githubusercontent.com/lianmatsuo/remcycle/main/docs/images/panel.webp" alt="The remcycle panel in full screen. On the left, three tiles: two questions need you, nine memories, the index five per cent full. Under them a question about where deploys go, with buttons to take the suggestion, keep the memory, add it to the chat or skip. On the right, what was learned lately, what was left open and what was closed lately." width="100%">
73
+ </p>
74
+
75
+ Type `/remcycle` in any session.
76
+
77
+ - **Needs you.** Memories a session or a review has put in question, one at a time, with what the memory says and why it is doubted. You take the suggestion, keep the memory, or add it to the chat to talk it through.
78
+ - **Memories.** How many there are and where each came from: you said it, you agreed to it, or it was written before remcycle.
79
+ - **Index used.** How full the list is that Claude Code loads at the start of a session. This is the number remcycle exists to keep low.
80
+ - **Learned lately, Left open, Closed lately.** The newest of each, with the whole list a button away. A thread closes when the work is done, and you can reopen one.
81
+
82
+ ## How it works
83
+
84
+ ```mermaid
85
+ flowchart LR
86
+ work(["You and<br/>Claude Code"])
87
+ archive[("Archive<br/>word for word")]
88
+ dream{{"The dream<br/>once a day"}}
89
+ memory["Memory<br/>short, sourced notes"]
90
+ work -- "saved" --> archive
91
+ archive -- "what is new" --> dream
92
+ dream -- "what you decided" --> memory
93
+ memory -- "next session" --> work
94
+ dream -. "asks if unsure" .-> work
95
+ ```
96
+
97
+ [How it works](https://github.com/lianmatsuo/remcycle/blob/main/docs/how-it-works.md) explains each part in plain words, with pictures.
98
+
99
+ ## A mod, not a prompt
100
+
101
+ A skill or an instructions file is text that Claude reads and may or may not act on. remcycle is a mod: code that runs inside Claude Code and changes what a session does.
102
+
103
+ - **When a conversation starts**, it hands Claude what you have said and what earlier sessions left unfinished.
104
+ - **It gives Claude three tools.** `recall` searches past sessions, `close_thread` marks unfinished work done, and `settle_memory` applies a ruling the two of you reached.
105
+ - **It adds a panel.** `/remcycle` shows what it holds, and lets you rule on what it doubts.
106
+ - **When a session ends**, it files what was said.
107
+
108
+ Behind the mod is a program of its own, the `dream` command, with an archive, a daily run, and checks that everything the dream writes to memory has to pass.
109
+
110
+ ```mermaid
111
+ flowchart TB
112
+ subgraph inside["Inside Claude Code"]
113
+ session(["Your session"])
114
+ mod["The remcycle mod<br/>hooks, three tools, a panel"]
115
+ own[("Claude Code's<br/>own memory")]
116
+ end
117
+ subgraph machine["On your machine"]
118
+ dream{{"The dream command"}}
119
+ archive[("Archive<br/>every session")]
120
+ copy[("The dream's copy<br/>of memory")]
121
+ night(["Once a day,<br/>from a session"])
122
+ end
123
+ model(["The model, through<br/>your own Claude Code"])
124
+ session <--> mod
125
+ mod -- "asks, and files sessions" --> dream
126
+ night --> dream
127
+ dream <--> archive
128
+ dream <--> copy
129
+ dream -- "new sessions" --> model
130
+ dream -. "only when you publish" .-> own
131
+ ```
132
+
133
+ ## What it does without asking
134
+
135
+ Once installed, it saves what was said when a session ends, hands each new session what was learned, and once a day starts the dream in the background to read the new sessions. The dream is the part that uses your Claude plan, and `dream daily off`, or the switch in the panel, turns it off.
136
+
137
+ Four things never happen without you: writing into the memory Claude Code itself loads, retiring or replacing a note you already had, deleting anything from the archive, and reading a project you have excluded.
138
+
139
+ ## Find out more
140
+
141
+ - [How it works](https://github.com/lianmatsuo/remcycle/blob/main/docs/how-it-works.md): the idea, in plain words and pictures.
142
+ - [Reference](https://github.com/lianmatsuo/remcycle/blob/main/docs/reference.md): every command and setting.
143
+ - [The daily dream](https://github.com/lianmatsuo/remcycle/blob/main/docs/schedule.md): its settings, and running it at a fixed time instead.
144
+ - [Design notes](https://github.com/lianmatsuo/remcycle/blob/main/docs/intent.md): why it is built this way, and what was rejected.
145
+ - [Privacy](https://github.com/lianmatsuo/remcycle/blob/main/PRIVACY.md): what it keeps on your machine, and what leaves it.
146
+
147
+ ## Status
148
+
149
+ This is early software, written for one person's machine and released as it stands. It reads Claude Code's transcripts and, when you ask it to, writes to the memory Claude Code loads, so read what a command will do before you run it.
150
+
151
+ It runs on macOS and Linux; Windows is untested. The mod needs Claude Code 2.1.287 or later in the terminal, or 2.1.286 in the desktop app.
152
+
153
+ remcycle is an independent project and is not affiliated with or endorsed by Anthropic.
154
+
155
+ ## Development
156
+
157
+ ```bash
158
+ scripts/check
159
+ ```
160
+
161
+ That runs everything CI runs: the Python lint and tests, the mod's manifest, types and tests, and the subjects of the branch's commits. [CONTRIBUTING.md](https://github.com/lianmatsuo/remcycle/blob/main/CONTRIBUTING.md) says how to start, and [AGENTS.md](https://github.com/lianmatsuo/remcycle/blob/main/AGENTS.md) is the working guide for people and coding agents alike.
162
+
163
+ The Python tests sit at these seams: transcript parsing, the archive against a real SQLite file, settings, reconciliation as pure functions, the memory store against folders in Claude Code's format, extraction through a stand-in for the model, the gate, and whole dream runs against temporary folders.
164
+
165
+ The mod's tests run in Claude Code's own plugin test kit, so that half of the check needs Claude Code installed.
166
+
167
+ ## Licence
168
+
169
+ Apache-2.0. See [LICENSE](https://github.com/lianmatsuo/remcycle/blob/main/LICENSE). Copyright 2026 Lian Matsuo, as [NOTICE](https://github.com/lianmatsuo/remcycle/blob/main/NOTICE) says.
@@ -0,0 +1,62 @@
1
+ [project]
2
+ name = "remcycle"
3
+ version = "0.3.0"
4
+ description = "Garbage collection for Claude Code's memory: rereads your sessions every day, keeps what you decided, and questions stale notes"
5
+ dynamic = ["readme"]
6
+ license = "Apache-2.0"
7
+ license-files = ["LICENSE", "NOTICE"]
8
+ requires-python = ">=3.12"
9
+ authors = [{ name = "Lian Matsuo" }]
10
+ dependencies = []
11
+
12
+ [project.urls]
13
+ Homepage = "https://github.com/lianmatsuo/remcycle"
14
+ Changelog = "https://github.com/lianmatsuo/remcycle/blob/main/CHANGELOG.md"
15
+ Issues = "https://github.com/lianmatsuo/remcycle/issues"
16
+
17
+ [project.scripts]
18
+ dream = "dream.cli:main"
19
+
20
+ [dependency-groups]
21
+ dev = [
22
+ "pytest>=8",
23
+ "ruff>=0.16.10",
24
+ ]
25
+
26
+ [build-system]
27
+ requires = ["hatchling", "hatch-fancy-pypi-readme>=25.1"]
28
+ build-backend = "hatchling.build"
29
+
30
+ [tool.hatch.build.targets.wheel]
31
+ packages = ["src/dream"]
32
+
33
+ [tool.hatch.build.targets.sdist]
34
+ include = ["/src", "/tests", "/CHANGELOG.md"]
35
+
36
+ # PyPI shows the README away from the repository, so its links and pictures are given in full.
37
+ [tool.hatch.metadata.hooks.fancy-pypi-readme]
38
+ content-type = "text/markdown"
39
+
40
+ [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
41
+ path = "README.md"
42
+
43
+ [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
44
+ pattern = '\]\((?!https?://|#)([^)]+)\)'
45
+ replacement = '](https://github.com/lianmatsuo/remcycle/blob/main/\1)'
46
+
47
+ [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
48
+ pattern = 'href="(?!https?://|#)([^"]+)"'
49
+ replacement = 'href="https://github.com/lianmatsuo/remcycle/blob/main/\1"'
50
+
51
+ [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
52
+ pattern = 'src="(?!https?://)([^"]+)"'
53
+ replacement = 'src="https://raw.githubusercontent.com/lianmatsuo/remcycle/main/\1"'
54
+
55
+ [tool.ruff]
56
+ # Wide enough for the lines the code already has, so sorting imports does not rewrap them.
57
+ line-length = 160
58
+ # So imports of the package and of the tests' own helpers sort as this project's.
59
+ src = ["src", "tests"]
60
+
61
+ [tool.pytest.ini_options]
62
+ testpaths = ["tests"]
File without changes