mindslice-forge
Turn documents into a MindSlice workspace.
MindSlice is the memory engine. The forge is the tool that fills it: it takes one long document, a
folder of many files, or a mixture, drives the agent harness you choose through the conversion,
and checks every result with the mindslice command. Sources of any size work,
because they are read in chunks and each chunk is handled by a fresh agent session that continues
the work of the ones before it.
The forge itself is small on purpose. It keeps the inventory, the state, the checkpoints and the
checks; everything that needs understanding of the text is done by the agent, following the
templates in mindslice_forge/prompts/.
Python 3.12+, standard library only. Needs mindslice 0.1.0 or newer, git, and an agent harness
that can run a session unattended from the command line.
When to use Forge
Use Forge when you want an agent to distill source documents into topic cards. MindSlice itself handles the other starting points without Forge:
mindslice init <workspace>creates empty memory for learning through conversation.mindslice -w <workspace> ...opens an existing workspace directly.mindslice -w <workspace> mount <directory>mounts a.sliceor a plain Markdown notes folder read-only, without LLM conversion.
MindSlice's setup skill guides onboarding; its builder skill uses Forge for conversion and connects the result. Forge is optional for MindSlice users; the engine does not call an LLM or require Forge as a runtime dependency.
Install
pipx install mindslice-forge # or: uv tool install mindslice-forge
Install the MindSlice engine the same way (pipx install mindslice): Forge and the agent sessions
it starts call the mindslice command by name, so both must be on PATH. Make sure the harness
you will use is authenticated and its model is available.
(For local development from source: git clone https://github.com/pancerZH/MindSlice-forge.git && cd MindSlice-forge && pipx install -e ..)
Use
HARNESS='...' # the command that runs one agent session: see "The harness command" below
mindslice-forge novel.txt \
--harness-cmd "$HARNESS" \
--dict wiki-summary.txt \
--prompt "Extract the world and its background for solo role-play. Record how a thing changes over time as several cards that extend one another, not as one crowded card." \
--sample 2 \
-o ./novel.workspace
| Argument | Meaning |
|---|---|
SOURCE... |
Documents or folders to convert. Text files in UTF-8, GB18030 or UTF-16; other files are listed and left out. |
--dict PATH |
A reference frame: an outline, glossary or encyclopedia page about the sources. It shapes names and structure and is never a source of facts. Repeatable. |
--prompt TEXT_OR_FILE |
What to extract and how. |
-o, --output DIR |
The workspace to create. Default: ./<first source name>.workspace. |
--sample N |
Process only the first N chunks, to try a prompt before a long run. |
--chunk-size CHARS |
Target size of a chunk. Default 100000 characters. |
--harness-cmd COMMAND |
The command line that runs one agent session; see The harness command. Needed for everything except --dry-run. |
--from STAGE |
Redo the build from plan, split, extract or finalize. |
--dry-run |
Show the inventory, the directories a session must reach and what would run. Calls no agent and writes nothing. |
mindslice-forge ./project-docs ./adr --harness-cmd "$HARNESS" \
--prompt "Rules, architecture and operating procedures for new engineers."
Running the same command again continues an unfinished build. A typical session:
mindslice-forge novel.txt --harness-cmd "$HARNESS" --prompt prompt.md --sample 2 # try two chunks
git -C novel.workspace log -p # see what each chunk produced
# edit prompt.md
mindslice-forge novel.txt --harness-cmd "$HARNESS" --prompt prompt.md --sample 2 --from extract # extract again
mindslice-forge novel.txt --harness-cmd "$HARNESS" --prompt prompt.md # satisfied: run the rest
If the sources, the dict, the prompt or the chunk size change after a build has started, the forge
refuses to continue silently: say which stage to redo with --from, or choose another output.
The harness command
Forge knows no agent product. You give it the command line that runs one agent session of
the harness you use, with its model and options, and Forge runs that command once per step: from
the forge directory, with no terminal attached, after filling in the placeholders {message}
(one line telling the agent to read the prompt file and do what it says), {prompt_file} and
{workdir}. Do not quote the placeholders. The command must:
- contain
{message}or{prompt_file}, so that the agent receives its task; - name files and directories by absolute paths, as it does not run from your directory;
- end when the task is done, with exit status 0 on success;
- never wait for an answer: no questions, and no permission prompts for reading and writing files or running shell commands;
- let the agent write in the workspace and the forge directory and read the sources and every
--dict(--dry-runlists these directories); - give the agent's shell a
PATHwith themindslicecommand.
mindslice-forge --help prints the same list. Take the options from your harness's own help:
look for its non-interactive mode (often called print, exec or headless), the option that
approves tool use without asking, the option for the model, and, if it limits file access, the
option that grants directories. As an illustration only, this is such a command for Antigravity's
agy; other harnesses, and other versions of this one, have their own options:
HARNESS='agy --print={message} --dangerously-skip-permissions --disable-slash-commands --output-format stream-json \
--model <model> --add-dir /abs/novel.workspace --add-dir /abs/sources'
A new command is checked before it is used. Before the first step with a command, one short
session has to run mindslice --version, read a source file and write a file in the workspace.
If it cannot, the build stops there, within seconds or minutes, and says which requirement
failed and how the session's log ends. The command that passed is recorded in the forge
directory; changing the command, for example to another model, checks it again.
One document or many
Files and chunks are units of reading, nothing more. They decide neither the slices nor the cards.
- A folder is read recursively. Hidden files and folders are ignored; files that are not text (images, PDF, Word) are listed in the inventory and left out, so convert those to text first.
- Small files are kept whole and share a chunk; a large file is cut at its own chapters or sections. The agent decides the grouping and the reading order when it plans: related files together, what the rest builds on first. It can leave out a whole file, such as generated output or a copy, and must give the reason.
- Everything is accounted for. Every line of every text file ends up in exactly one chunk or in a skipped range with a reason; the forge checks this before any card is written.
- Cards follow topics. Several files can feed one card and one file can feed many. Where files disagree, the later one does not win by being read later: the cards record what each statement applies to, and unresolved disagreements are listed in the report.
- If everything fits in one chunk, no splitting happens and one session reads it all.
How it works
| Stage | Who | What happens |
|---|---|---|
| profile | forge | Lists the sources with their encoding, line count and size. |
| plan | agent, one session | Studies the structure of the documents and how the files relate, reads the dict, writes the build plan (slices, folders, card paths, reading order, how change over time is recorded), creates the slices, and writes a splitter program if the sources do not fit in one chunk. |
| split | forge | Runs the splitter and checks that every source line is in exactly one chunk or in a declared skipped range, and that no chunk is too large or has lost text. Problems go back to the agent. |
| extract | agent, one session per chunk, in order | Is told which files and lines the chunk holds, reads it in full, searches the workspace for what already exists, writes or extends cards, and leaves a ledger and a note for the next session. |
| finalize | agent, one session | Writes each slice's overview, clears remaining problems, tries retrieval questions, and writes the report. |
After every agent session the forge runs mindslice validate. Errors, and fixable warnings on the
cards that session touched, go to a repair session (at most --max-repairs). Errors that survive
stop the build; warnings do not, and are listed in the report. A session that fails or times out
is rolled back and retried.
Search before creating cards is a required check. The extract and finalize prompts provide a
python /path/to/mindslice_forge/lookup.py WORKSPACE "name" command. It searches the workspace
through mindslice search --json and records successful searches in the forge directory's
lookups.jsonl. Search each name separately. Every new card must have a title or alias covered
by a lookup from that step or its repairs: the whole query occurs in the title/alias or vice
versa, ignoring case and respecting Latin word boundaries. A base name can cover period cards.
Older steps and failed attempts do not count; edits to existing cards and slice overviews are
exempt. Missing lookups are errors that stop the build if repairs cannot resolve them.
Repairs must search the missing names, read matches, and merge duplicate cards into the one that already existed, preserving facts and updating links. This check verifies search coverage at the end of the step; deciding whether two cards describe the same thing remains the agent's job.
Output
novel.workspace/ a MindSlice workspace, ready for `mindslice -w novel.workspace ...`
├── mounts.toml, overlay/, staging/
├── slices/<name>.slice/ the cards, mounted
└── .git/ one commit per finished chunk: the checkpoints (slices and mounts only)
novel.workspace.forge/ build state and evidence; keep it for resume and review
├── state.json, harness.json progress, and the harness command that passed its check
├── profile.md, plan.md, split.py, report.md
├── chunks/ the chunk files and manifest.json
├── ledger/, handoff/ per chunk: what was recorded, and the note for the next session
├── lookups.jsonl successful name searches
└── prompts/, logs/ every prompt as it was sent, and each session's output
The forge directory lives next to the workspace so that workspace backups do not carry a copy of the sources.
Connect the result to MindSlice
For a new workspace, pass the intended workspace path to Forge with -o. Forge initializes
it and mounts the generated slices; do not run mindslice init there first. After checking the
report, validation and representative facts, use mindslice -w <output> ... or connect your
agent's MCP server to that workspace.
A connected workspace can still be built further: run the same command to continue a sample, or
use --from to redo a stage. What the agent has learned in the meantime (overlay/, staging/
and the engine's .history/) is kept out of the checkpoints, so no rerun, retry or rollback
touches it. If the slices or the mount table were changed outside the forge, by mindslice bake,
mount or unmount or by hand, the forge stops and lists the changes instead of discarding
them; build into another output and mount its slices. Do not bake or change mounts while a build
is running.
For an existing workspace, build into a separate new directory. Forge cannot take over a
nonempty workspace that it did not create. Inspect the resulting slices/*.slice aliases and
dependencies, then mount the selected individual slices. For example, if the build produced
handbook.slice and its alias is available in your destination:
mindslice -w ~/mindslice mount /path/to/build.workspace/slices/handbook.slice \
--precedence 50 --role curated
mindslice -w ~/mindslice validate
Mount each required slice separately, preserving aliases used by cross-slice links. Resolve
collisions before mounting; do not silently replace an existing mount. The workspace root,
slices/ parent and .forge/ build directory are not slice mount targets.
Keep mounted paths stable. If you plan further Forge rebuilds, first copy the selected slices to
new durable library directories or the destination's slices/ directory and mount those copies.
Otherwise a rebuild or rollback can change the files the live workspace reads. Keep the sibling
.forge/ directory for resume and evidence; completed slice artifacts do not depend on it at runtime.
Validation checks structure, and recorded lookups check search coverage. Neither establishes that the model preserved every fact. Treat input coverage, retrieval and source fidelity as separate checks; a sampled build remains partial after it is connected to an agent.
Safety
- Select allowed sources before invoking Forge, including
--dry-run: recursive scanning does not honor project ignore files or forbidden-directory markers. Pass selected files or prepare an allowed snapshot with exclusions applied before traversal. Keep output, reference files and conversion prompts outside the source directories. - The harness command you give runs agents with tool permissions approved automatically, and the splitter is a program the agent wrote. Convert sources you trust, or run the forge in a sandbox.
- Forge writes its output workspace and sibling
.forge/directory. It refuses to take over an existing nonempty output it did not create. Rollbacks happen inside its output directory and cover the slices and the mount table only, neveroverlay/,staging/or.history/.
Tests
python -m unittest discover -s tests -t . -v
The unit tests need nothing. The functional tests run whole builds with the real mindslice and
git commands and a fake agent (tests/fake_harness.py); no model is
called.
Checking a first real run
After a --sample 2 run against a real harness, look at:
- the
[split]line: the chunk count and the first and last titles should match the document;novel.workspace.forge/chunks/manifest.jsonlists what was skipped and why; git -C novel.workspace log --stat: one commit per chunk, with the cards it touched;mindslice -w novel.workspace validate, and a few searches and reads of things you know are in the first chunks, including one that changes over time;novel.workspace.forge/report.md.
Metadata
Release files for mindslice-forge 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| mindslice_forge-0.1.0.tar.gz | 57.2 kB | With provenance | Details for mindslice_forge-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mindslice_forge-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for mindslice_forge-0.1.0-py3-none-any.whl |
Total release size: 103.3 kB
Release files / mindslice_forge-0.1.0.tar.gz
| Download URL | mindslice_forge-0.1.0.tar.gz |
|---|---|
| Size | 57.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ad0db9e7d7e0c54d1078336f11fc68402e054b27617dfd0c4c125368281cd58a
|
|
BLAKE2b-256 checksum How to use checksums |
d7cb0c25b4cd1103200242b8b4253d3eb86f9ca0b94a10f7a90503cd36d18aca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 14, 2026.
Transparency logRelease files / mindslice_forge-0.1.0-py3-none-any.whl
| Download URL | mindslice_forge-0.1.0-py3-none-any.whl |
|---|---|
| Size | 46.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4408bae424c4f59b0c9fd3627db8c2e39623156bdf7f81d7ba53cae3cbafa4eb
|
|
BLAKE2b-256 checksum How to use checksums |
595d9d730771e143987988667664e808233aeb9cc30bff822dd7df838e3c48e0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 14, 2026.
Transparency logSecurity for mindslice-forge 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for mindslice_forge-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 14, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.