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.
- remcycle-0.3.0/.gitignore +6 -0
- remcycle-0.3.0/CHANGELOG.md +39 -0
- remcycle-0.3.0/LICENSE +177 -0
- remcycle-0.3.0/NOTICE +2 -0
- remcycle-0.3.0/PKG-INFO +169 -0
- remcycle-0.3.0/pyproject.toml +62 -0
- remcycle-0.3.0/src/dream/__init__.py +0 -0
- remcycle-0.3.0/src/dream/archive.py +406 -0
- remcycle-0.3.0/src/dream/claims.py +102 -0
- remcycle-0.3.0/src/dream/cli.py +596 -0
- remcycle-0.3.0/src/dream/daily.py +105 -0
- remcycle-0.3.0/src/dream/dreaming.py +492 -0
- remcycle-0.3.0/src/dream/extract.py +462 -0
- remcycle-0.3.0/src/dream/gate.py +135 -0
- remcycle-0.3.0/src/dream/memory.py +736 -0
- remcycle-0.3.0/src/dream/mirror.py +150 -0
- remcycle-0.3.0/src/dream/outside.py +175 -0
- remcycle-0.3.0/src/dream/reconcile.py +199 -0
- remcycle-0.3.0/src/dream/redact.py +38 -0
- remcycle-0.3.0/src/dream/review.py +194 -0
- remcycle-0.3.0/src/dream/session.py +153 -0
- remcycle-0.3.0/src/dream/settings.py +122 -0
- remcycle-0.3.0/src/dream/transcript.py +177 -0
- remcycle-0.3.0/tests/support.py +70 -0
- remcycle-0.3.0/tests/test_archive.py +468 -0
- remcycle-0.3.0/tests/test_cli.py +498 -0
- remcycle-0.3.0/tests/test_daily.py +34 -0
- remcycle-0.3.0/tests/test_dreaming.py +755 -0
- remcycle-0.3.0/tests/test_extract.py +169 -0
- remcycle-0.3.0/tests/test_gate.py +148 -0
- remcycle-0.3.0/tests/test_memory.py +602 -0
- remcycle-0.3.0/tests/test_outside.py +149 -0
- remcycle-0.3.0/tests/test_reconcile.py +149 -0
- remcycle-0.3.0/tests/test_release.py +36 -0
- remcycle-0.3.0/tests/test_review.py +145 -0
- remcycle-0.3.0/tests/test_settings.py +87 -0
- remcycle-0.3.0/tests/test_transcript.py +208 -0
|
@@ -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
remcycle-0.3.0/PKG-INFO
ADDED
|
@@ -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
|