mindslice-forge 0.1.0__py3-none-any.whl

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.
@@ -0,0 +1,275 @@
1
+ Metadata-Version: 2.4
2
+ Name: mindslice-forge
3
+ Version: 0.1.0
4
+ Summary: Turn documents into a MindSlice workspace by driving an agent harness (Python stdlib only).
5
+ Author: pancerZH
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/pancerZH/MindSlice-forge
8
+ Project-URL: Issues, https://github.com/pancerZH/MindSlice-forge/issues
9
+ Project-URL: MindSlice, https://github.com/pancerZH/MindSlice
10
+ Keywords: llm,agents,memory,markdown,mindslice
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
16
+ Requires-Python: >=3.12
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Dynamic: license-file
20
+
21
+ # mindslice-forge
22
+
23
+ Turn documents into a [MindSlice](https://github.com/pancerZH/MindSlice) workspace.
24
+
25
+ MindSlice is the memory engine. The forge is the tool that fills it: it takes one long document, a
26
+ folder of many files, or a mixture, drives the agent harness you choose through the conversion,
27
+ and checks every result with the `mindslice` command. Sources of any size work,
28
+ because they are read in chunks and each chunk is handled by a fresh agent session that continues
29
+ the work of the ones before it.
30
+
31
+ The forge itself is small on purpose. It keeps the inventory, the state, the checkpoints and the
32
+ checks; everything that needs understanding of the text is done by the agent, following the
33
+ templates in [`mindslice_forge/prompts/`](https://github.com/pancerZH/MindSlice-forge/tree/main/mindslice_forge/prompts).
34
+
35
+ Python 3.12+, standard library only. Needs `mindslice` 0.1.0 or newer, `git`, and an agent harness
36
+ that can run a session unattended from the command line.
37
+
38
+ ## When to use Forge
39
+
40
+ Use Forge when you want an agent to distill source documents into topic cards. MindSlice itself
41
+ handles the other starting points without Forge:
42
+
43
+ - `mindslice init <workspace>` creates empty memory for learning through conversation.
44
+ - `mindslice -w <workspace> ...` opens an existing workspace directly.
45
+ - `mindslice -w <workspace> mount <directory>` mounts a `.slice` or a plain Markdown notes folder
46
+ read-only, without LLM conversion.
47
+
48
+ MindSlice's [setup skill](https://github.com/pancerZH/MindSlice/blob/main/skills/mindslice-setup/SKILL.md)
49
+ guides onboarding; its [builder skill](https://github.com/pancerZH/MindSlice/blob/main/skills/slice-builder/SKILL.md)
50
+ uses Forge for conversion and connects the result. Forge is optional for MindSlice users; the
51
+ engine does not call an LLM or require Forge as a runtime dependency.
52
+
53
+ ## Install
54
+
55
+ ```bash
56
+ pipx install mindslice-forge # or: uv tool install mindslice-forge
57
+ ```
58
+
59
+ Install the MindSlice engine the same way (`pipx install mindslice`): Forge and the agent sessions
60
+ it starts call the `mindslice` command by name, so both must be on `PATH`. Make sure the harness
61
+ you will use is authenticated and its model is available.
62
+
63
+ *(For local development from source: `git clone https://github.com/pancerZH/MindSlice-forge.git && cd MindSlice-forge && pipx install -e .`.)*
64
+
65
+ ## Use
66
+
67
+ ```bash
68
+ HARNESS='...' # the command that runs one agent session: see "The harness command" below
69
+ mindslice-forge novel.txt \
70
+ --harness-cmd "$HARNESS" \
71
+ --dict wiki-summary.txt \
72
+ --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." \
73
+ --sample 2 \
74
+ -o ./novel.workspace
75
+ ```
76
+
77
+ | Argument | Meaning |
78
+ | --- | --- |
79
+ | `SOURCE...` | Documents or folders to convert. Text files in UTF-8, GB18030 or UTF-16; other files are listed and left out. |
80
+ | `--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. |
81
+ | `--prompt TEXT_OR_FILE` | What to extract and how. |
82
+ | `-o, --output DIR` | The workspace to create. Default: `./<first source name>.workspace`. |
83
+ | `--sample N` | Process only the first N chunks, to try a prompt before a long run. |
84
+ | `--chunk-size CHARS` | Target size of a chunk. Default 100000 characters. |
85
+ | `--harness-cmd COMMAND` | The command line that runs one agent session; see [The harness command](#the-harness-command). Needed for everything except `--dry-run`. |
86
+ | `--from STAGE` | Redo the build from `plan`, `split`, `extract` or `finalize`. |
87
+ | `--dry-run` | Show the inventory, the directories a session must reach and what would run. Calls no agent and writes nothing. |
88
+
89
+ ```bash
90
+ mindslice-forge ./project-docs ./adr --harness-cmd "$HARNESS" \
91
+ --prompt "Rules, architecture and operating procedures for new engineers."
92
+ ```
93
+
94
+ **Running the same command again continues an unfinished build.** A typical session:
95
+
96
+ ```bash
97
+ mindslice-forge novel.txt --harness-cmd "$HARNESS" --prompt prompt.md --sample 2 # try two chunks
98
+ git -C novel.workspace log -p # see what each chunk produced
99
+ # edit prompt.md
100
+ mindslice-forge novel.txt --harness-cmd "$HARNESS" --prompt prompt.md --sample 2 --from extract # extract again
101
+ mindslice-forge novel.txt --harness-cmd "$HARNESS" --prompt prompt.md # satisfied: run the rest
102
+ ```
103
+
104
+ If the sources, the dict, the prompt or the chunk size change after a build has started, the forge
105
+ refuses to continue silently: say which stage to redo with `--from`, or choose another output.
106
+
107
+ ## The harness command
108
+
109
+ Forge knows no agent product. You give it the command line that runs **one agent session** of
110
+ the harness you use, with its model and options, and Forge runs that command once per step: from
111
+ the forge directory, with no terminal attached, after filling in the placeholders `{message}`
112
+ (one line telling the agent to read the prompt file and do what it says), `{prompt_file}` and
113
+ `{workdir}`. Do not quote the placeholders. The command must:
114
+
115
+ - contain `{message}` or `{prompt_file}`, so that the agent receives its task;
116
+ - name files and directories by absolute paths, as it does not run from your directory;
117
+ - end when the task is done, with exit status 0 on success;
118
+ - never wait for an answer: no questions, and no permission prompts for reading and writing
119
+ files or running shell commands;
120
+ - let the agent write in the workspace and the forge directory and read the sources and every
121
+ `--dict` (`--dry-run` lists these directories);
122
+ - give the agent's shell a `PATH` with the `mindslice` command.
123
+
124
+ `mindslice-forge --help` prints the same list. Take the options from your harness's own help:
125
+ look for its non-interactive mode (often called print, exec or headless), the option that
126
+ approves tool use without asking, the option for the model, and, if it limits file access, the
127
+ option that grants directories. As an illustration only, this is such a command for Antigravity's
128
+ `agy`; other harnesses, and other versions of this one, have their own options:
129
+
130
+ ```bash
131
+ HARNESS='agy --print={message} --dangerously-skip-permissions --disable-slash-commands --output-format stream-json \
132
+ --model <model> --add-dir /abs/novel.workspace --add-dir /abs/sources'
133
+ ```
134
+
135
+ **A new command is checked before it is used.** Before the first step with a command, one short
136
+ session has to run `mindslice --version`, read a source file and write a file in the workspace.
137
+ If it cannot, the build stops there, within seconds or minutes, and says which requirement
138
+ failed and how the session's log ends. The command that passed is recorded in the forge
139
+ directory; changing the command, for example to another model, checks it again.
140
+
141
+ ## One document or many
142
+
143
+ Files and chunks are units of reading, nothing more. They decide neither the slices nor the cards.
144
+
145
+ - **A folder** is read recursively. Hidden files and folders are ignored; files that are not text
146
+ (images, PDF, Word) are listed in the inventory and left out, so convert those to text first.
147
+ - **Small files** are kept whole and share a chunk; **a large file** is cut at its own chapters or
148
+ sections. The agent decides the grouping and the reading order when it plans: related files
149
+ together, what the rest builds on first. It can leave out a whole file, such as generated
150
+ output or a copy, and must give the reason.
151
+ - **Everything is accounted for.** Every line of every text file ends up in exactly one chunk or
152
+ in a skipped range with a reason; the forge checks this before any card is written.
153
+ - **Cards follow topics.** Several files can feed one card and one file can feed many. Where files
154
+ disagree, the later one does not win by being read later: the cards record what each statement
155
+ applies to, and unresolved disagreements are listed in the report.
156
+ - If everything fits in one chunk, no splitting happens and one session reads it all.
157
+
158
+ ## How it works
159
+
160
+ | Stage | Who | What happens |
161
+ | --- | --- | --- |
162
+ | profile | forge | Lists the sources with their encoding, line count and size. |
163
+ | 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. |
164
+ | 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. |
165
+ | 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. |
166
+ | finalize | agent, one session | Writes each slice's overview, clears remaining problems, tries retrieval questions, and writes the report. |
167
+
168
+ After every agent session the forge runs `mindslice validate`. Errors, and fixable warnings on the
169
+ cards that session touched, go to a repair session (at most `--max-repairs`). Errors that survive
170
+ stop the build; warnings do not, and are listed in the report. A session that fails or times out
171
+ is rolled back and retried.
172
+
173
+ **Search before creating cards is a required check.** The extract and finalize prompts provide a
174
+ `python /path/to/mindslice_forge/lookup.py WORKSPACE "name"` command. It searches the workspace
175
+ through `mindslice search --json` and records successful searches in the forge directory's
176
+ `lookups.jsonl`. Search each name separately. Every new card must have a title or alias covered
177
+ by a lookup from that step or its repairs: the whole query occurs in the title/alias or vice
178
+ versa, ignoring case and respecting Latin word boundaries. A base name can cover period cards.
179
+ Older steps and failed attempts do not count; edits to existing cards and slice overviews are
180
+ exempt. Missing lookups are errors that stop the build if repairs cannot resolve them.
181
+
182
+ Repairs must search the missing names, read matches, and merge duplicate cards into the one that
183
+ already existed, preserving facts and updating links. This check verifies search coverage at the
184
+ end of the step; deciding whether two cards describe the same thing remains the agent's job.
185
+
186
+ ## Output
187
+
188
+ ```text
189
+ novel.workspace/ a MindSlice workspace, ready for `mindslice -w novel.workspace ...`
190
+ ├── mounts.toml, overlay/, staging/
191
+ ├── slices/<name>.slice/ the cards, mounted
192
+ └── .git/ one commit per finished chunk: the checkpoints (slices and mounts only)
193
+ novel.workspace.forge/ build state and evidence; keep it for resume and review
194
+ ├── state.json, harness.json progress, and the harness command that passed its check
195
+ ├── profile.md, plan.md, split.py, report.md
196
+ ├── chunks/ the chunk files and manifest.json
197
+ ├── ledger/, handoff/ per chunk: what was recorded, and the note for the next session
198
+ ├── lookups.jsonl successful name searches
199
+ └── prompts/, logs/ every prompt as it was sent, and each session's output
200
+ ```
201
+
202
+ The forge directory lives next to the workspace so that workspace backups do not carry a copy of
203
+ the sources.
204
+
205
+ ## Connect the result to MindSlice
206
+
207
+ **For a new workspace**, pass the intended workspace path to Forge with `-o`. Forge initializes
208
+ it and mounts the generated slices; do not run `mindslice init` there first. After checking the
209
+ report, validation and representative facts, use `mindslice -w <output> ...` or connect your
210
+ agent's MCP server to that workspace.
211
+
212
+ A connected workspace can still be built further: run the same command to continue a sample, or
213
+ use `--from` to redo a stage. What the agent has learned in the meantime (`overlay/`, `staging/`
214
+ and the engine's `.history/`) is kept out of the checkpoints, so no rerun, retry or rollback
215
+ touches it. If the slices or the mount table were changed outside the forge, by `mindslice bake`,
216
+ `mount` or `unmount` or by hand, the forge stops and lists the changes instead of discarding
217
+ them; build into another output and mount its slices. Do not bake or change mounts while a build
218
+ is running.
219
+
220
+ **For an existing workspace**, build into a separate new directory. Forge cannot take over a
221
+ nonempty workspace that it did not create. Inspect the resulting `slices/*.slice` aliases and
222
+ dependencies, then mount the selected individual slices. For example, if the build produced
223
+ `handbook.slice` and its alias is available in your destination:
224
+
225
+ ```bash
226
+ mindslice -w ~/mindslice mount /path/to/build.workspace/slices/handbook.slice \
227
+ --precedence 50 --role curated
228
+ mindslice -w ~/mindslice validate
229
+ ```
230
+
231
+ Mount each required slice separately, preserving aliases used by cross-slice links. Resolve
232
+ collisions before mounting; do not silently replace an existing mount. The workspace root,
233
+ `slices/` parent and `.forge/` build directory are not slice mount targets.
234
+
235
+ Keep mounted paths stable. If you plan further Forge rebuilds, first copy the selected slices to
236
+ new durable library directories or the destination's `slices/` directory and mount those copies.
237
+ Otherwise a rebuild or rollback can change the files the live workspace reads. Keep the sibling
238
+ `.forge/` directory for resume and evidence; completed slice artifacts do not depend on it at runtime.
239
+
240
+ Validation checks structure, and recorded lookups check search coverage. Neither establishes that
241
+ the model preserved every fact. Treat input coverage, retrieval and source fidelity as separate
242
+ checks; a sampled build remains partial after it is connected to an agent.
243
+
244
+ ## Safety
245
+
246
+ - Select allowed sources before invoking Forge, including `--dry-run`: recursive scanning does
247
+ not honor project ignore files or forbidden-directory markers. Pass selected files or prepare
248
+ an allowed snapshot with exclusions applied before traversal. Keep output, reference files and
249
+ conversion prompts outside the source directories.
250
+ - The harness command you give runs agents with tool permissions approved automatically, and the
251
+ splitter is a program the agent wrote. Convert sources you trust, or run the forge in a sandbox.
252
+ - Forge writes its output workspace and sibling `.forge/` directory. It refuses to take over an
253
+ existing nonempty output it did not create. Rollbacks happen inside its output directory and
254
+ cover the slices and the mount table only, never `overlay/`, `staging/` or `.history/`.
255
+
256
+ ## Tests
257
+
258
+ ```bash
259
+ python -m unittest discover -s tests -t . -v
260
+ ```
261
+
262
+ The unit tests need nothing. The functional tests run whole builds with the real `mindslice` and
263
+ `git` commands and a fake agent ([`tests/fake_harness.py`](https://github.com/pancerZH/MindSlice-forge/blob/main/tests/fake_harness.py)); no model is
264
+ called.
265
+
266
+ ### Checking a first real run
267
+
268
+ After a `--sample 2` run against a real harness, look at:
269
+
270
+ - the `[split]` line: the chunk count and the first and last titles should match the document;
271
+ `novel.workspace.forge/chunks/manifest.json` lists what was skipped and why;
272
+ - `git -C novel.workspace log --stat`: one commit per chunk, with the cards it touched;
273
+ - `mindslice -w novel.workspace validate`, and a few searches and reads of things you know are in
274
+ the first chunks, including one that changes over time;
275
+ - `novel.workspace.forge/report.md`.
@@ -0,0 +1,23 @@
1
+ mindslice_forge/__init__.py,sha256=4-RV2O6Jiw6Oo0TMVDvmDkHeOr4RBDJQPedyGx1qYSk,504
2
+ mindslice_forge/__main__.py,sha256=E6Gls0DNz8GQK2K-kOUIx8cYhgANW_CH54VKrfCfs14,52
3
+ mindslice_forge/checkpoint.py,sha256=j332VW0oXnih0vjpN4I3nP3sPASy4JWX99DrSQwAIIw,4745
4
+ mindslice_forge/cli.py,sha256=qNePXGU2kPSrvCrjxhc_W87RYQ8w5tWTbV0yqQae7UI,4438
5
+ mindslice_forge/engine.py,sha256=D_S8rfjLqtZxwoNUl5pvDW03F_wGZd6gurZyerFVUok,3931
6
+ mindslice_forge/harness.py,sha256=QdU387bR1FiWC35Te1Rw6xjAXIG4-2R8Jq8JcqhrPTc,3836
7
+ mindslice_forge/lookup.py,sha256=H2FQnPc8lxXFGwloBeuuGEQzD4G0fJAvYaGGzvZ7rAI,3393
8
+ mindslice_forge/pipeline.py,sha256=Mhpvl7xhuUDG8trmqyFnmLX6uB_MAC2Ws7ws2rSOOcw,20556
9
+ mindslice_forge/profile.py,sha256=FAuNmQQS99lBc8Xrj7uDvjfjHSi3-J7c4nqdbcWw75U,2969
10
+ mindslice_forge/split.py,sha256=iDorZigZ_Cxwu1bfhw0F07yIakdPv3jSfRCmq9FcTEo,6583
11
+ mindslice_forge/state.py,sha256=YNc1e7sNUWTkQckWez-HkA78WPxYyhDXel-p_uwib1M,1481
12
+ mindslice_forge/prompts/card-format.md,sha256=FPRSCCoTs5OBwO696x7GWzw-sMKc7zD1lL53AQ3O8BY,5051
13
+ mindslice_forge/prompts/extract.md,sha256=xIGOLVWAycZmoLBqSirhuW0aBPCA2ScY4MrUbKhT-T4,5874
14
+ mindslice_forge/prompts/finalize.md,sha256=JmMr4UYOGI3icN64hJFQZf5m39qayg_kAXcb1FxyVH8,3799
15
+ mindslice_forge/prompts/plan.md,sha256=Za3PXodn5QEK5SLN0129OnQVSZX8nJPMeZXOSUWNPmQ,7977
16
+ mindslice_forge/prompts/probe.md,sha256=-GL3RR1poyiHjOq4XqUzumvAXzg0tUy28LmNFTSSnsM,762
17
+ mindslice_forge/prompts/repair.md,sha256=vqX6eXDXkDX2AZwK2mkZ2fJEOc-Mr9Z80wibCZDhOcA,1437
18
+ mindslice_forge-0.1.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
19
+ mindslice_forge-0.1.0.dist-info/METADATA,sha256=xYMFqIYwbvNpoWS8O62oYs6XKDOpMeR3Mw1Zg69qbAs,16249
20
+ mindslice_forge-0.1.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
21
+ mindslice_forge-0.1.0.dist-info/entry_points.txt,sha256=L1-jJGQCOhTn1BDxDqGWQ4W_evQ-f_O_cYKQ8mChxeA,61
22
+ mindslice_forge-0.1.0.dist-info/top_level.txt,sha256=UG2QCvNTpBUju2BqXotNFmhSoPmCAbB1Wi9Sc57X48g,16
23
+ mindslice_forge-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ mindslice-forge = mindslice_forge.cli:main
@@ -0,0 +1,202 @@
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
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
@@ -0,0 +1 @@
1
+ mindslice_forge