raidlock 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.
- raidlock/__init__.py +11 -0
- raidlock/__main__.py +5 -0
- raidlock/_python.py +58 -0
- raidlock/achievements.py +156 -0
- raidlock/approvals.py +237 -0
- raidlock/bench.py +286 -0
- raidlock/bridge/__init__.py +186 -0
- raidlock/budgets.py +178 -0
- raidlock/cli.py +2153 -0
- raidlock/commands_install.py +114 -0
- raidlock/core/__init__.py +26 -0
- raidlock/core/advisories.py +16 -0
- raidlock/core/billing.py +54 -0
- raidlock/core/board.py +2251 -0
- raidlock/core/brief.py +111 -0
- raidlock/core/clock.py +40 -0
- raidlock/core/cost.py +198 -0
- raidlock/core/db.py +608 -0
- raidlock/core/errors.py +52 -0
- raidlock/core/exe.py +6 -0
- raidlock/core/hints.py +32 -0
- raidlock/core/identity.py +285 -0
- raidlock/core/lead.py +758 -0
- raidlock/core/lead_env.py +23 -0
- raidlock/core/lead_hook.py +42 -0
- raidlock/core/leases.py +19 -0
- raidlock/core/lock.py +99 -0
- raidlock/core/messages.py +98 -0
- raidlock/core/migrate.py +579 -0
- raidlock/core/model.py +126 -0
- raidlock/core/models.py +109 -0
- raidlock/core/paths.py +61 -0
- raidlock/core/portable.py +53 -0
- raidlock/core/receipts.py +73 -0
- raidlock/core/registry.py +39 -0
- raidlock/core/repos.py +250 -0
- raidlock/core/safeio.py +201 -0
- raidlock/core/status.py +52 -0
- raidlock/core/store.py +107 -0
- raidlock/core/tokens.py +77 -0
- raidlock/core/transcript.py +208 -0
- raidlock/duel.py +371 -0
- raidlock/foresight.py +191 -0
- raidlock/frames.py +162 -0
- raidlock/gitguard.py +753 -0
- raidlock/guard.py +239 -0
- raidlock/hooks.py +1526 -0
- raidlock/infer.py +205 -0
- raidlock/limits.py +685 -0
- raidlock/lore/__init__.py +22 -0
- raidlock/lore/approval.py +145 -0
- raidlock/lore/capture.py +146 -0
- raidlock/lore/cli.py +109 -0
- raidlock/lore/distill.py +17 -0
- raidlock/lore/frontmatter.py +56 -0
- raidlock/lore/inject.py +127 -0
- raidlock/lore/vault.py +264 -0
- raidlock/mcp/__init__.py +34 -0
- raidlock/mcp/resources.py +72 -0
- raidlock/mcp/server.py +184 -0
- raidlock/mcp/tools.py +178 -0
- raidlock/notify.py +144 -0
- raidlock/party.py +239 -0
- raidlock/pr.py +575 -0
- raidlock/prsync.py +318 -0
- raidlock/recipes/README.md +34 -0
- raidlock/recipes/__init__.py +105 -0
- raidlock/recipes/docs-refresh.md +15 -0
- raidlock/recipes/multi-repo-refactor.md +15 -0
- raidlock/recipes/security-audit.md +27 -0
- raidlock/recipes/upgrade-deps.md +15 -0
- raidlock/reputation.py +194 -0
- raidlock/resume.py +329 -0
- raidlock/resurrect.py +419 -0
- raidlock/routing.py +419 -0
- raidlock/runners/__init__.py +16 -0
- raidlock/runners/base.py +341 -0
- raidlock/runners/brief.py +176 -0
- raidlock/runners/claude_code.py +121 -0
- raidlock/runners/cli.py +110 -0
- raidlock/runners/codex.py +114 -0
- raidlock/runners/gemini.py +64 -0
- raidlock/runners/isolation.py +391 -0
- raidlock/runners/policy.py +123 -0
- raidlock/runners/runner.py +921 -0
- raidlock/runners/shell.py +35 -0
- raidlock/runners/verifycache.py +93 -0
- raidlock/runners/workspace.py +376 -0
- raidlock/scan.py +357 -0
- raidlock/snapshot.py +151 -0
- raidlock/treasury.py +210 -0
- raidlock/tui.py +223 -0
- raidlock/web/__init__.py +5 -0
- raidlock/web/achievements/view.css +19 -0
- raidlock/web/achievements/view.js +58 -0
- raidlock/web/bosses/view.css +19 -0
- raidlock/web/bosses/view.js +46 -0
- raidlock/web/cli.py +90 -0
- raidlock/web/data.py +687 -0
- raidlock/web/export.py +153 -0
- raidlock/web/frames/view.css +25 -0
- raidlock/web/frames/view.js +63 -0
- raidlock/web/graph/__init__.py +142 -0
- raidlock/web/graph/view.css +33 -0
- raidlock/web/graph/view.js +136 -0
- raidlock/web/raidmap/__init__.py +205 -0
- raidlock/web/raidmap/view.css +15 -0
- raidlock/web/raidmap/view.js +47 -0
- raidlock/web/replay/__init__.py +258 -0
- raidlock/web/replay/view.css +13 -0
- raidlock/web/replay/view.js +127 -0
- raidlock/web/server.py +292 -0
- raidlock/web/static/app.css +851 -0
- raidlock/web/static/app.js +2102 -0
- raidlock/web/static/fonts/OFL.txt +93 -0
- raidlock/web/static/fonts/cinzel-600.woff2 +0 -0
- raidlock/web/static/fonts/cinzel-700.woff2 +0 -0
- raidlock/web/static/icon-32.png +0 -0
- raidlock/web/static/icon-raid.svg +1 -0
- raidlock/web/static/icon.svg +1 -0
- raidlock/web/static/index.html +122 -0
- raidlock-0.1.0.dist-info/METADATA +186 -0
- raidlock-0.1.0.dist-info/RECORD +126 -0
- raidlock-0.1.0.dist-info/WHEEL +4 -0
- raidlock-0.1.0.dist-info/entry_points.txt +34 -0
- raidlock-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Copyright 2020 The Cinzel Project Authors (https://github.com/NDISCOVER/Cinzel)
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
This license is copied below, and is also available with a FAQ at:
|
|
5
|
+
http://scripts.sil.org/OFL
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------
|
|
9
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
+
-----------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
PREAMBLE
|
|
13
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
+
development of collaborative font projects, to support the font creation
|
|
15
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
+
open framework in which fonts may be shared and improved in partnership
|
|
17
|
+
with others.
|
|
18
|
+
|
|
19
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
+
redistributed and/or sold with any software provided that any reserved
|
|
23
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
+
however, cannot be released under any other type of license. The
|
|
25
|
+
requirement for fonts to remain under this license does not apply
|
|
26
|
+
to any document created using the fonts or their derivatives.
|
|
27
|
+
|
|
28
|
+
DEFINITIONS
|
|
29
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
+
include source files, build scripts and documentation.
|
|
32
|
+
|
|
33
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
+
copyright statement(s).
|
|
35
|
+
|
|
36
|
+
"Original Version" refers to the collection of Font Software components as
|
|
37
|
+
distributed by the Copyright Holder(s).
|
|
38
|
+
|
|
39
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
+
new environment.
|
|
43
|
+
|
|
44
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
+
writer or other person who contributed to the Font Software.
|
|
46
|
+
|
|
47
|
+
PERMISSION & CONDITIONS
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
+
Software, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
1) Neither the Font Software nor any of its individual components,
|
|
54
|
+
in Original or Modified Versions, may be sold by itself.
|
|
55
|
+
|
|
56
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
+
redistributed and/or sold with any software, provided that each copy
|
|
58
|
+
contains the above copyright notice and this license. These can be
|
|
59
|
+
included either as stand-alone text files, human-readable headers or
|
|
60
|
+
in the appropriate machine-readable metadata fields within text or
|
|
61
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
+
|
|
63
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
+
presented to the users.
|
|
67
|
+
|
|
68
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
+
Software shall not be used to promote, endorse or advertise any
|
|
70
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
+
permission.
|
|
73
|
+
|
|
74
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
+
must be distributed entirely under this license, and must not be
|
|
76
|
+
distributed under any other license. The requirement for fonts to
|
|
77
|
+
remain under this license does not apply to any document created
|
|
78
|
+
using the Font Software.
|
|
79
|
+
|
|
80
|
+
TERMINATION
|
|
81
|
+
This license becomes null and void if any of the above conditions are
|
|
82
|
+
not met.
|
|
83
|
+
|
|
84
|
+
DISCLAIMER
|
|
85
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="raidlock"><title>raidlock</title><defs><linearGradient id="g" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#3b2a6e"/><stop offset="1" stop-color="#160f2e"/></linearGradient></defs><rect width="64" height="64" rx="14" fill="url(#g)" stroke="#f5c451" stroke-width="2"/><g fill="#f5c451" transform="translate(6 6) scale(.8125)"><circle cx="16" cy="20" r="7"/><circle cx="32" cy="9" r="7"/><circle cx="48" cy="20" r="7"/><path d="M12 20h8v16h-8zM44 20h8v16h-8z"/><path d="M14.3 17.5l15.4-10.6 4.6 5.6-15.4 10.6zM49.7 17.5l-15.4-10.6-4.6 5.6 15.4 10.6z"/><path fill-rule="evenodd" d="M12 32h40a8 8 0 0 1 8 8v16a8 8 0 0 1-8 8H12a8 8 0 0 1-8-8V40a8 8 0 0 1 8-8zM32 40a4 4 0 0 0-4 4v4a4 4 0 0 0 8 0v-4a4 4 0 0 0-4-4z"/></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="raidlock"><title>raidlock</title><rect width="64" height="64" rx="14" fill="#2f5bd3"/><g fill="#ffffff" transform="translate(6 6) scale(.8125)"><circle cx="16" cy="20" r="7"/><circle cx="32" cy="9" r="7"/><circle cx="48" cy="20" r="7"/><path d="M12 20h8v16h-8zM44 20h8v16h-8z"/><path d="M14.3 17.5l15.4-10.6 4.6 5.6-15.4 10.6zM49.7 17.5l-15.4-10.6-4.6 5.6 15.4 10.6z"/><path fill-rule="evenodd" d="M12 32h40a8 8 0 0 1 8 8v16a8 8 0 0 1-8 8H12a8 8 0 0 1-8-8V40a8 8 0 0 1 8-8zM32 40a4 4 0 0 0-4 4v4a4 4 0 0 0 8 0v-4a4 4 0 0 0-4-4z"/></g></svg>
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en" data-theme="plain" data-anim="on">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="color-scheme" content="dark light">
|
|
7
|
+
<title>raidlock</title>
|
|
8
|
+
<link rel="icon" href="/static/icon-raid.svg" type="image/svg+xml">
|
|
9
|
+
<link rel="icon" href="/static/icon-32.png" type="image/png" sizes="32x32">
|
|
10
|
+
<link rel="stylesheet" href="/static/app.css">
|
|
11
|
+
<link rel="stylesheet" href="/static/views/raidmap.css">
|
|
12
|
+
<link rel="stylesheet" href="/static/views/replay.css">
|
|
13
|
+
<link rel="stylesheet" href="/static/views/graph.css">
|
|
14
|
+
<link rel="stylesheet" href="/static/views/frames.css">
|
|
15
|
+
<link rel="stylesheet" href="/static/views/achievements.css">
|
|
16
|
+
<link rel="stylesheet" href="/static/views/bosses.css">
|
|
17
|
+
<script src="/static/views/raidmap.js" defer></script>
|
|
18
|
+
<script src="/static/views/replay.js" defer></script>
|
|
19
|
+
<script src="/static/views/graph.js" defer></script>
|
|
20
|
+
<script src="/static/views/frames.js" defer></script>
|
|
21
|
+
<script src="/static/views/achievements.js" defer></script>
|
|
22
|
+
<script src="/static/views/bosses.js" defer></script>
|
|
23
|
+
<script src="/static/app.js" defer></script>
|
|
24
|
+
</head>
|
|
25
|
+
<body>
|
|
26
|
+
<a class="skip" href="#content">Skip to the board</a>
|
|
27
|
+
<canvas id="stars" aria-hidden="true"></canvas>
|
|
28
|
+
<header>
|
|
29
|
+
|
|
30
|
+
<div class="brand">
|
|
31
|
+
<h1 id="brandText"><svg class="lockup" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 454.15 83.20" aria-hidden="true" focusable="false" width="142" height="26"><g class="lk-mark" fill="currentColor" transform="scale(1.3)"><circle cx="16" cy="20" r="7"/><circle cx="32" cy="9" r="7"/><circle cx="48" cy="20" r="7"/><path d="M12 20h8v16h-8zM44 20h8v16h-8z"/><path d="M14.3 17.5l15.4-10.6 4.6 5.6-15.4 10.6zM49.7 17.5l-15.4-10.6-4.6 5.6 15.4 10.6z"/><path fill-rule="evenodd" d="M12 32h40a8 8 0 0 1 8 8v16a8 8 0 0 1-8 8H12a8 8 0 0 1-8-8V40a8 8 0 0 1 8-8zM32 40a4 4 0 0 0-4 4v4a4 4 0 0 0 8 0v-4a4 4 0 0 0-4-4z"/></g><path class="lk-word" fill="currentColor" transform="translate(99.75 82.20)" d="M5.45 0V-51.56H17.33V-43H17.49Q18.91 -47.44 21.95 -49.75Q24.99 -52.06 30 -52.06Q31.23 -52.06 32.25 -52Q33.27 -51.94 34.01 -51.88V-40.94Q33.33 -41.03 31.67 -41.17Q30.02 -41.31 28.19 -41.31Q25.29 -41.31 22.92 -39.98Q20.55 -38.64 19.17 -35.95Q17.79 -33.27 17.79 -29.21V0Z M54.83 0.83Q49.68 0.83 45.66 -0.89Q41.65 -2.61 39.32 -6.06Q37 -9.51 37 -14.63Q37 -19.04 38.65 -21.9Q40.31 -24.77 43.14 -26.48Q45.98 -28.19 49.64 -29.08Q53.3 -29.97 57.26 -30.39Q62.05 -30.93 64.86 -31.33Q67.66 -31.74 68.87 -32.55Q70.07 -33.37 70.07 -35.13V-35.51Q70.07 -37.73 68.95 -39.42Q67.83 -41.11 65.72 -42.07Q63.61 -43.04 60.65 -43.04Q57.68 -43.04 55.42 -42.08Q53.15 -41.12 51.82 -39.43Q50.49 -37.74 50.3 -35.54H38.46Q38.77 -40.68 41.55 -44.5Q44.32 -48.33 49.25 -50.47Q54.18 -52.61 60.93 -52.61Q65.95 -52.61 69.92 -51.4Q73.89 -50.19 76.65 -47.9Q79.41 -45.62 80.85 -42.4Q82.28 -39.18 82.28 -35.16V0H70.18V-7.29H69.98Q68.77 -4.99 66.83 -3.15Q64.88 -1.3 61.95 -0.24Q59.02 0.83 54.83 0.83ZM57.86 -8.29Q61.87 -8.29 64.61 -9.75Q67.35 -11.22 68.75 -13.65Q70.14 -16.09 70.14 -19.07V-24.68Q69.57 -24.31 68.45 -23.97Q67.33 -23.63 65.79 -23.32Q64.26 -23 62.46 -22.71Q60.67 -22.41 58.77 -22.13Q56.14 -21.76 53.92 -20.9Q51.7 -20.05 50.35 -18.57Q49.01 -17.09 49.01 -14.74Q49.01 -12.74 50.1 -11.28Q51.19 -9.83 53.18 -9.06Q55.17 -8.29 57.86 -8.29Z M92.17 0V-51.56H104.51V0ZM98.32 -59.23Q95.17 -59.23 93.06 -61.25Q90.96 -63.27 90.96 -66.24Q90.96 -69.22 93.06 -71.23Q95.17 -73.23 98.3 -73.23Q101.47 -73.23 103.58 -71.23Q105.69 -69.23 105.69 -66.22Q105.69 -63.25 103.58 -61.24Q101.47 -59.23 98.32 -59.23Z M134.35 1.05Q127.64 1.05 122.61 -2.33Q117.57 -5.71 114.8 -11.75Q112.02 -17.8 112.02 -25.82Q112.02 -33.76 114.82 -39.8Q117.62 -45.84 122.65 -49.22Q127.68 -52.61 134.28 -52.61Q137.65 -52.61 140.55 -51.69Q143.45 -50.78 145.79 -48.93Q148.13 -47.09 149.78 -44.26H149.86V-72.75H162.2V0H150.05V-7.88H149.97Q148.36 -4.89 145.99 -2.9Q143.62 -0.91 140.68 0.07Q137.74 1.05 134.35 1.05ZM137.25 -9.25Q141.28 -9.25 144.27 -11.3Q147.26 -13.35 148.9 -17.08Q150.54 -20.81 150.54 -25.82Q150.54 -30.85 148.9 -34.56Q147.26 -38.28 144.27 -40.33Q141.28 -42.38 137.25 -42.38Q133.46 -42.38 130.58 -40.45Q127.7 -38.53 126.1 -34.84Q124.5 -31.16 124.5 -25.82Q124.5 -20.5 126.1 -16.8Q127.7 -13.1 130.58 -11.18Q133.46 -9.25 137.25 -9.25Z M184.45 -72.75V0H172.1V-72.75Z M217.39 1.17Q209.82 1.17 204.09 -2.22Q198.35 -5.61 195.15 -11.66Q191.96 -17.72 191.96 -25.72Q191.96 -33.75 195.15 -39.83Q198.35 -45.91 204.09 -49.32Q209.82 -52.73 217.39 -52.73Q225.01 -52.73 230.72 -49.32Q236.44 -45.91 239.63 -39.83Q242.83 -33.75 242.83 -25.72Q242.83 -17.72 239.63 -11.66Q236.44 -5.61 230.72 -2.22Q225.01 1.17 217.39 1.17ZM217.39 -9.12Q221.36 -9.12 224.27 -11.13Q227.17 -13.14 228.76 -16.87Q230.35 -20.61 230.35 -25.72Q230.35 -30.91 228.76 -34.63Q227.17 -38.36 224.27 -40.4Q221.36 -42.44 217.39 -42.44Q213.47 -42.44 210.54 -40.42Q207.62 -38.39 206.02 -34.65Q204.43 -30.91 204.43 -25.72Q204.43 -20.58 206.02 -16.86Q207.62 -13.14 210.53 -11.13Q213.44 -9.12 217.39 -9.12Z M273.16 1.17Q265.63 1.17 259.95 -2.24Q254.26 -5.66 251.1 -11.72Q247.94 -17.79 247.94 -25.72Q247.94 -33.68 251.1 -39.78Q254.26 -45.87 259.95 -49.3Q265.63 -52.73 273.16 -52.73Q278.02 -52.73 282.12 -51.29Q286.22 -49.84 289.31 -47.21Q292.39 -44.58 294.27 -41Q296.15 -37.42 296.56 -33.11H284.47Q284.14 -35.2 283.25 -36.91Q282.36 -38.62 280.94 -39.86Q279.52 -41.1 277.61 -41.79Q275.71 -42.47 273.3 -42.47Q269.28 -42.47 266.39 -40.42Q263.49 -38.36 261.95 -34.6Q260.41 -30.84 260.41 -25.72Q260.41 -20.65 261.95 -16.91Q263.49 -13.17 266.38 -11.13Q269.27 -9.09 273.3 -9.09Q275.71 -9.09 277.58 -9.75Q279.46 -10.41 280.81 -11.66Q282.17 -12.9 283.06 -14.64Q283.95 -16.39 284.38 -18.52H296.56Q296.22 -14.27 294.37 -10.68Q292.52 -7.1 289.41 -4.43Q286.3 -1.77 282.17 -0.3Q278.04 1.17 273.16 1.17Z M315.03 -16.09V-30.67H316.25L336.3 -51.56H351.12L327.19 -26.13H324.72ZM303.77 0V-72.75H316.12V0ZM337.67 0 319.8 -23.39 328.08 -32 352.4 0Z"/></svg><span class="sr-only">raidlock</span></h1>
|
|
32
|
+
<nav id="crumbs" aria-label="Breadcrumb">Loading the board…</nav>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="hud">
|
|
35
|
+
<span id="hudLevel" aria-live="polite"></span>
|
|
36
|
+
<a id="export" class="tog" hidden download>Export snapshot</a>
|
|
37
|
+
<details id="soundMenu" class="menu">
|
|
38
|
+
<summary class="tog" id="soundSummary">Sound</summary>
|
|
39
|
+
<div class="menu-body sound-body">
|
|
40
|
+
<button type="button" class="tog" id="sound" aria-pressed="true">Sound on</button>
|
|
41
|
+
<label class="vol">Volume <input type="range" id="vol" min="0" max="100" value="80"></label>
|
|
42
|
+
<fieldset id="cueList" class="cues">
|
|
43
|
+
<legend>Play a sound when</legend>
|
|
44
|
+
</fieldset>
|
|
45
|
+
</div>
|
|
46
|
+
</details>
|
|
47
|
+
<details id="settings" class="menu">
|
|
48
|
+
<summary class="tog">Settings</summary>
|
|
49
|
+
<div class="menu-body">
|
|
50
|
+
<button type="button" class="tog" id="animBtn" aria-pressed="true">Animations: on</button>
|
|
51
|
+
<button type="button" class="tog" id="notify" aria-pressed="false">Desktop alerts: off</button>
|
|
52
|
+
<button type="button" class="tog" id="achieveBtn" aria-pressed="false">Achievements: off</button>
|
|
53
|
+
<div id="providerInfo" class="provider-info"></div>
|
|
54
|
+
</div>
|
|
55
|
+
</details>
|
|
56
|
+
</div>
|
|
57
|
+
</header>
|
|
58
|
+
<nav id="tabs" aria-label="Workspaces"></nav>
|
|
59
|
+
<main id="content" tabindex="-1">
|
|
60
|
+
<div id="notice" role="status" hidden></div>
|
|
61
|
+
<section id="limits" aria-label="Provider usage" hidden></section>
|
|
62
|
+
<section id="overview" aria-labelledby="overviewTitle" hidden><section id="realmbar"><h2 id="overviewTitle">Workspaces</h2><p id="realmStatus" class="status-line"></p><nav id="realmTabs" aria-label="Overview views"></nav></section><div id="projects"></div><p id="idle" hidden></p></section>
|
|
63
|
+
<div id="board" hidden>
|
|
64
|
+
<section id="wsbar" aria-labelledby="wsName">
|
|
65
|
+
<div class="wsrow"><h2 id="wsName"></h2><div id="repos" role="group" aria-label="Filter the board by repo"></div><div class="search" role="search"><label for="q" class="sr-only">Search cards</label><input id="q" type="search" placeholder="Search" autocomplete="off" spellcheck="false" aria-describedby="qCount"><kbd class="qkey" aria-hidden="true">/</kbd><span id="qCount" aria-live="polite"></span></div></div>
|
|
66
|
+
<p id="wsStatus" class="status-line" aria-live="polite"></p>
|
|
67
|
+
<nav id="viewTabs" aria-label="Board views"></nav>
|
|
68
|
+
</section>
|
|
69
|
+
<section id="viewPane" hidden></section>
|
|
70
|
+
<div id="focus">
|
|
71
|
+
<details id="needs" class="block fold">
|
|
72
|
+
<summary><h2 id="needsTitle">Needs you</h2><span class="sub" id="needsSub"></span></summary>
|
|
73
|
+
<ul id="needsList" class="rows"></ul>
|
|
74
|
+
</details>
|
|
75
|
+
<details id="loreInbox" class="block fold" hidden>
|
|
76
|
+
<summary><h2 id="loreTitle">Lore inbox</h2></summary>
|
|
77
|
+
<ul id="loreList" class="rows"></ul>
|
|
78
|
+
</details>
|
|
79
|
+
<nav id="workTabs" aria-label="Work columns"></nav>
|
|
80
|
+
<div id="columns">
|
|
81
|
+
<details id="todo" class="block fold"><summary><h2 id="todoTitle">To do</h2><span class="sub">Queued work, oldest first.</span></summary><ul id="todoList" class="rows"></ul></details>
|
|
82
|
+
<details id="doing" class="block fold"><summary><h2 id="doingTitle">In progress</h2><span class="sub">Active work, owners and held locks.</span></summary><ul id="doingList" class="rows"></ul></details>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
<section id="lanes" aria-label="All cards by status" hidden></section>
|
|
86
|
+
</div>
|
|
87
|
+
<section id="panels" aria-label="More">
|
|
88
|
+
<details id="donePanel" class="block fold">
|
|
89
|
+
<summary><h2 id="doneTitle">Done</h2><span class="sub">Recently completed work.</span> <span class="cls" id="doneHint"></span></summary>
|
|
90
|
+
<ul id="doneList" class="rows"></ul>
|
|
91
|
+
</details>
|
|
92
|
+
<details id="agentsPanel" class="block fold">
|
|
93
|
+
<summary><h2 id="agentsTitle">Team</h2><span class="sub">Agents and cost.</span> <span class="cls" id="agentsHint"></span></summary>
|
|
94
|
+
<div id="agents"></div>
|
|
95
|
+
<section id="costPanel"><h3 id="costTitle">Cost</h3><span class="cls" id="costHint"></span>
|
|
96
|
+
<div id="treasury"></div></section>
|
|
97
|
+
</details>
|
|
98
|
+
<div id="score"></div>
|
|
99
|
+
<details id="logPanel" class="block fold">
|
|
100
|
+
<summary><h2 id="logTitle">Activity</h2><span class="sub">Completed cards and work records.</span> <span class="cls" id="logHint"></span></summary>
|
|
101
|
+
<div class="panel-tools"><label class="vol"><span id="logFilterLabel">Show</span> <select id="logFilter"></select></label></div>
|
|
102
|
+
<div id="activityChips"></div><div id="log" class="vlist" role="group" aria-label="Activity records"></div>
|
|
103
|
+
<div id="logDetail" role="region" aria-label="Selected record" tabindex="-1" hidden></div>
|
|
104
|
+
</details>
|
|
105
|
+
<details id="chatter" class="block fold">
|
|
106
|
+
<summary><h2 id="chatTitle">Chatter</h2><span id="chatUnread" class="badge"></span> <span class="sub">Live messages and notes, newest first.</span></summary>
|
|
107
|
+
<div class="panel-tools"><label class="vol">Show <select id="chatFilter"></select></label></div>
|
|
108
|
+
<div id="chat" tabindex="0" role="log" aria-live="polite" aria-relevant="additions" aria-label="Recent messages and notes"></div>
|
|
109
|
+
</details>
|
|
110
|
+
</section>
|
|
111
|
+
<dialog id="kbdHelp" aria-labelledby="kbdTitle"><h2 id="kbdTitle">Keyboard shortcuts</h2><dl>
|
|
112
|
+
<dt><kbd>/</kbd></dt><dd>Search cards and chat</dd>
|
|
113
|
+
<dt><kbd>Esc</kbd></dt><dd>Clear the search, close a menu, the card drawer or this panel</dd>
|
|
114
|
+
<dt><kbd>Tab</kbd> then <kbd>Enter</kbd></dt><dd>Move between cards and open one</dd>
|
|
115
|
+
<dt><kbd>?</kbd></dt><dd>Show this panel</dd>
|
|
116
|
+
</dl><form method="dialog"><button type="submit" class="tog">Close</button></form></dialog>
|
|
117
|
+
</main>
|
|
118
|
+
<div id="toasts" popover="manual" role="log" aria-live="polite" aria-label="Board events"></div>
|
|
119
|
+
<footer id="footer"><span class="credit"><a href="https://github.com/agi1clj/raidlock" target="_blank" rel="noopener">raidlock {{version}}</a> · made with <span aria-label="love">❤️</span> by <a href="https://www.linkedin.com/in/gabriel-arcas/" target="_blank" rel="noopener">Gabriel Arcas</a></span></footer>
|
|
120
|
+
<button type="button" id="soundBanner" hidden>Sound is on: click anywhere to enable it</button>
|
|
121
|
+
</body>
|
|
122
|
+
</html>
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: raidlock
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Local-first lease-and-review board for coding agents from any provider
|
|
5
|
+
Project-URL: Homepage, https://github.com/agi1clj/raidlock
|
|
6
|
+
Project-URL: Documentation, https://github.com/agi1clj/raidlock/tree/main/docs/guides
|
|
7
|
+
Project-URL: Repository, https://github.com/agi1clj/raidlock
|
|
8
|
+
Project-URL: Issues, https://github.com/agi1clj/raidlock/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/agi1clj/raidlock/blob/main/CHANGELOG.md
|
|
10
|
+
Author: agi1clj
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: agents,claude-code,codex,coordination,gemini,leases
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
16
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
24
|
+
Classifier: Topic :: Software Development
|
|
25
|
+
Requires-Python: >=3.11
|
|
26
|
+
Provides-Extra: test
|
|
27
|
+
Requires-Dist: hypothesis>=6; extra == 'test'
|
|
28
|
+
Requires-Dist: pytest>=8; extra == 'test'
|
|
29
|
+
Provides-Extra: ui-test
|
|
30
|
+
Requires-Dist: pytest-playwright>=0.5; extra == 'ui-test'
|
|
31
|
+
Requires-Dist: pytest>=8; extra == 'ui-test'
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
|
|
34
|
+
<picture>
|
|
35
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/brand/raidlock-lockup-dark.svg">
|
|
36
|
+
<img src="docs/assets/brand/raidlock-lockup.svg" alt="raidlock" width="227" height="42">
|
|
37
|
+
</picture>
|
|
38
|
+
|
|
39
|
+
# raidlock
|
|
40
|
+
|
|
41
|
+
A lease-and-review board that lets several coding agents work on the same repos without colliding.
|
|
42
|
+
|
|
43
|
+
**raidlock stops parallel coding agents from overwriting each other's files, across Claude Code, Codex and Gemini, and won't accept their work until the tests pass and an agent from another provider signs off.**
|
|
44
|
+
|
|
45
|
+
<p align="center"><img src="docs/assets/demo.gif" alt="raidlock web UI tour" width="960"></p>
|
|
46
|
+
|
|
47
|
+
[](https://github.com/agi1clj/raidlock/actions/workflows/ci.yml)
|
|
48
|
+
[](https://pypi.org/project/raidlock/)
|
|
49
|
+
[](LICENSE)
|
|
50
|
+
|
|
51
|
+
Run Claude Code, Codex, Gemini, shell scripts and people on one board. Each piece of work is a card. Claiming a card leases the exact paths it may touch, and hooks refuse edits anywhere else. One lead closes cards, and only after a signed verify receipt exists for the commit and, on a mixed-provider board, a reviewer from another provider has approved. You can follow who is doing what in the terminal or in a raid-themed web UI.
|
|
52
|
+
|
|
53
|
+
## Why
|
|
54
|
+
|
|
55
|
+
Parallel agents fail in predictable ways. Two of them edit the same file. One reports "tests pass" and nobody checks. The lead loses track of who is on what, and a stalled session keeps writing after someone else took over. raidlock is a small local tool that handles each of these:
|
|
56
|
+
|
|
57
|
+
- Path leases are atomic, keyed by the repo's git remote, and checked across every project on your machine.
|
|
58
|
+
- A fence number changes with every new owner, so a replaced worker's writes are refused.
|
|
59
|
+
- `raid done` is lead-only and refuses a card until its verify command has passed in a sandbox on the exact commit.
|
|
60
|
+
- Once a second provider joins, `done` also needs an approval from a reviewer on another provider.
|
|
61
|
+
- Board-first by default: the hooks deny edits outside a card you hold, including the lead's, and subagent launches whose prompt names no open card.
|
|
62
|
+
- It runs on your machine with no runtime dependencies. The Claude Code plugin adds about 190 tokens per session ([benchmark](docs/guides/benchmark.md)).
|
|
63
|
+
|
|
64
|
+
## Install with your agent
|
|
65
|
+
|
|
66
|
+
Paste this into Claude Code, Codex or another terminal coding agent:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
Install raidlock by following the "Install with your agent" steps in
|
|
70
|
+
https://github.com/agi1clj/raidlock/blob/main/docs/guides/install.md
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The agent installs the CLI and the Claude Code plugin, runs `raid doctor`, creates a board and explains the board-first rule back to you. It never reads the lead secret.
|
|
74
|
+
|
|
75
|
+
## Install by hand
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
uv tool install raidlock # or: pipx install raidlock
|
|
79
|
+
raid doctor
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
In Claude Code, add the plugin (hooks, skill and the `raid-worker` agent):
|
|
83
|
+
|
|
84
|
+
```text
|
|
85
|
+
/plugin marketplace add agi1clj/raidlock
|
|
86
|
+
/plugin install raidlock@raidlock
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Needs Python 3.11 or newer on Linux or macOS. On Windows, use WSL2 (expected to work, not yet tested). Codex and MCP setup: [Install](docs/guides/install.md).
|
|
90
|
+
|
|
91
|
+
## Quickstart
|
|
92
|
+
|
|
93
|
+
Lead terminal:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
mkdir -p ~/demo/shop && cd ~/demo/shop
|
|
97
|
+
raid quickstart --demo # a board, a demo repo acme-shop/, and you as the lead
|
|
98
|
+
LEAD_SECRET_FILE="<the path it printed>"
|
|
99
|
+
raid --lead-secret "$LEAD_SECRET_FILE" new "Reject empty carts" --id checkout \
|
|
100
|
+
--locks acme-shop/src/checkout --verify-cmd "python3 -m unittest"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Worker terminal:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
cd ~/demo/shop/acme-shop
|
|
107
|
+
raid up --join --agent worker-1 --card checkout --runtime human # then run the source line it prints
|
|
108
|
+
raid claim checkout --checkout "$PWD" # then paste the two export lines
|
|
109
|
+
raid ui --open # http://127.0.0.1:8765
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
worker-1 now holds `acme-shop/src/checkout`, and any other agent editing there is refused. [Getting started](docs/guides/getting-started.md) finishes the card: edit, commit, review, verify, done.
|
|
113
|
+
|
|
114
|
+
## How coordination works
|
|
115
|
+
|
|
116
|
+
One lead, many agents, one project. The lead splits work into cards with narrow, disjoint locks. Each worker claims one, posts notes and hands it back to review. The lead verifies and closes it:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
raid --lead-secret "$LEAD_SECRET_FILE" new "Paginate orders" --id orders \
|
|
120
|
+
--locks acme-shop/src/orders --verify-cmd "python3 -m unittest"
|
|
121
|
+
raid claim orders --checkout "$PWD" # worker
|
|
122
|
+
raid note orders "pagination added; tests pass" # worker; renews the lease
|
|
123
|
+
raid --lead-secret "$LEAD_SECRET_FILE" msg --to worker-1 --card orders "keep page size at 50"
|
|
124
|
+
raid move orders review --note "python3 -m unittest: 9 passed" # worker
|
|
125
|
+
raid --lead-secret "$LEAD_SECRET_FILE" verify orders # signed receipt on the commit
|
|
126
|
+
raid --lead-secret "$LEAD_SECRET_FILE" done orders
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Many projects. Each workspace has its own `.board/`, and every board registers in one lease index under `~/.raidlock`. A path locked from one workspace is locked in all of them. `raid ui` shows every workspace on its realm page, with tabs for Guilds, Tavern chatter and Treasury.
|
|
130
|
+
|
|
131
|
+
Many sessions. Separate Claude Code or Codex sessions join the same board with `raid up --join`, each in its own clone or worktree. Leases map through the git remote, so every checkout of a repo shares one lock space.
|
|
132
|
+
|
|
133
|
+
Mixed providers. When an agent from a second provider joins, raidlock turns on the verify gate and the cross-provider review gate and records the change. Values you set yourself with `raid config set` are kept.
|
|
134
|
+
|
|
135
|
+
Board-first enforcement, on by default. The Claude Code hooks deny edits outside the card you hold, and that includes the lead: a lead edit inside a git repo needs a card the lead holds (`require_card_for_lead_edits`). A `Task` or `Agent` launch is denied unless its prompt names an open card as `card <id>` (`board_first_subagents`). Turn either off with `raid --lead-secret FILE config set <key> off`. The git commit guard checks other agents' leases either way.
|
|
136
|
+
|
|
137
|
+
Full version: [Orchestration](docs/guides/orchestration.md).
|
|
138
|
+
|
|
139
|
+
## Two ways to run agents
|
|
140
|
+
|
|
141
|
+
| | Workstreams | Sandboxed agents |
|
|
142
|
+
|---|---|---|
|
|
143
|
+
| What | Sessions you run yourself: Claude Code, Codex, you | `raid delegate CARD --to codex\|claude\|gemini\|shell` runs an agent CLI for you |
|
|
144
|
+
| Where | Your own clone or worktree; claim with `raid claim CARD --checkout "$PWD"` | A throwaway clone with no remote and a cleared environment |
|
|
145
|
+
| Guard | Lease, edit hooks, git guards | Lease, a diff check against the card's locks and a secret scan; the lead applies the returned patch |
|
|
146
|
+
| Cleanup | Yours | The clone is deleted on `done`, `close` or `cancel`; logs and the patch stay |
|
|
147
|
+
|
|
148
|
+
Use a workstream for a session you watch, and `raid delegate` for unattended or less trusted runs. Details: [Workstreams and sandboxed agents](docs/guides/orchestration.md#workstreams-and-sandboxed-agents).
|
|
149
|
+
|
|
150
|
+
## Features
|
|
151
|
+
|
|
152
|
+
| Feature | Guide |
|
|
153
|
+
|---|---|
|
|
154
|
+
| Path leases with expiry and fencing, across clones, worktrees and workspaces | [Concepts](docs/guides/concepts.md) |
|
|
155
|
+
| Board-first hooks, git pre-commit and pre-push guards, runner diff | [Hooks](docs/guides/hooks.md) |
|
|
156
|
+
| Lead-only done, signed verify receipts, cross-provider review | [Verification](docs/guides/verification.md) |
|
|
157
|
+
| `raid delegate`, `raid next` routing on plan headroom, `raid duel`, `raid resume`, opt-in `raid resurrect` | [Orchestration](docs/guides/orchestration.md) |
|
|
158
|
+
| Import a checklist or a spec tool's `tasks.md`, lock suggestions, merge-conflict foresight, a lessons vault | [Planning](docs/guides/planning.md) |
|
|
159
|
+
| Pull requests from a verified commit; merged PRs close cards through the gates | [Pull requests](docs/guides/pr.md) |
|
|
160
|
+
| Spend per card, model, agent and day; delegation budgets | [Operations](docs/guides/operations.md#delegation-budgets) |
|
|
161
|
+
| Live web UI on `127.0.0.1`: Needs you first, quest log, chatter, cost, dependency graph, lease map, replay | [Web UI](docs/guides/ui.md) |
|
|
162
|
+
| CLI with `--json` and stable exit codes; an MCP server that never acts as lead | [Commands](docs/guides/commands.md), [MCP](docs/guides/mcp.md) |
|
|
163
|
+
| Optional hardened container image for `raid ui`, `raid mcp` and sandboxed verify | [Docker](docs/guides/docker.md) |
|
|
164
|
+
|
|
165
|
+
Gemini runs only through `raid delegate --to gemini`, and that adapter is tested against recorded events, not a live Gemini CLI.
|
|
166
|
+
|
|
167
|
+
## Documentation
|
|
168
|
+
|
|
169
|
+
- Start: [Install](docs/guides/install.md), [Getting started](docs/guides/getting-started.md), [Concepts](docs/guides/concepts.md)
|
|
170
|
+
- Run a board: [Lead playbook](docs/guides/lead-playbook.md), [Worker rules](docs/guides/worker-rules.md), [Claude Code plus Codex](docs/guides/multi-provider.md), [Orchestration](docs/guides/orchestration.md)
|
|
171
|
+
- Reference: [Commands](docs/guides/commands.md), [Protocol](PROTOCOL.md), [Hooks](docs/guides/hooks.md), [Verification](docs/guides/verification.md), [Web UI](docs/guides/ui.md), [MCP server](docs/guides/mcp.md)
|
|
172
|
+
- More: [Planning](docs/guides/planning.md), [Operations](docs/guides/operations.md), [Agent Teams and Codex hooks](docs/guides/native.md), [Docker image](docs/guides/docker.md), [Overview, FAQ and alternatives](docs/guides/overview.md), [Examples](examples/README.md)
|
|
173
|
+
|
|
174
|
+
If you are an agent, start with [skills/raidlock/SKILL.md](skills/raidlock/SKILL.md).
|
|
175
|
+
|
|
176
|
+
## Security
|
|
177
|
+
|
|
178
|
+
raidlock keeps cooperating agents out of each other's way. It is not a sandbox. Tokens, the lead secret and the verify signing key are files under your user account, readable by any process running as you. `raid verify` runs only under bubblewrap on Linux or `sandbox-exec` on macOS. The UI listens on `127.0.0.1` and answers `GET` only. Threat model and reporting: [SECURITY.md](SECURITY.md). Limits: [Security and limits](docs/guides/overview.md#security-and-limits).
|
|
179
|
+
|
|
180
|
+
## Contributing
|
|
181
|
+
|
|
182
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) and the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
183
|
+
|
|
184
|
+
## License
|
|
185
|
+
|
|
186
|
+
[MIT](LICENSE). The web UI bundles the Cinzel font under the [SIL Open Font License 1.1](src/raidlock/web/static/fonts/OFL.txt). raidlock is an independent project, not affiliated with or endorsed by Anthropic, OpenAI or Google. Claude, Codex and Gemini are trademarks of their respective owners.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
raidlock/__init__.py,sha256=icOqbssFEPuEEviiy7h0PKB-GizT9lMo2BKRh1xwuJA,249
|
|
2
|
+
raidlock/__main__.py,sha256=E6Gls0DNz8GQK2K-kOUIx8cYhgANW_CH54VKrfCfs14,52
|
|
3
|
+
raidlock/_python.py,sha256=NFOHu1EoJ2pIQwLwOcKEfQO7ZxNHcxEs5Ba--LL4NFU,1941
|
|
4
|
+
raidlock/achievements.py,sha256=V9nBtPAKDarOHx3gBQiH-nrgctheC80WXtjMcIoUhB0,6774
|
|
5
|
+
raidlock/approvals.py,sha256=J1vq1UOm1U6mdsjZQnquLoC3sv5MtgNDFpeMh3yRgbY,8755
|
|
6
|
+
raidlock/bench.py,sha256=eKCWxupTrtQrXhRbtieQltI7QpvqmlIWsUjrm1-4-Tk,11393
|
|
7
|
+
raidlock/budgets.py,sha256=zvte6yKFLvpwpt52cRQ5dAb0Az165LB58HR8Bgcz_Go,7075
|
|
8
|
+
raidlock/cli.py,sha256=kCIoIJeoj916j2qFkvQrRf0ZBafcxygTp-bzMb0rcnE,85438
|
|
9
|
+
raidlock/commands_install.py,sha256=-UkV6emkMyrLrbguPA19Gp5ednb04YIZ7xymr6eWpj4,3292
|
|
10
|
+
raidlock/duel.py,sha256=Sawc9R5z0eplcXa9-ZJZSR1dzwg6Q_kWxrrV1klIAcI,16461
|
|
11
|
+
raidlock/foresight.py,sha256=pw84kcmcj2btL7Xy4TF3avO7viWG4HvQVr-YpkxByS0,8126
|
|
12
|
+
raidlock/frames.py,sha256=YYe_CUE7S3Jq92zlXG31piQWgYkJJfme1ZEuYPtytpA,6419
|
|
13
|
+
raidlock/gitguard.py,sha256=st-HEZNFUU7CpWxQKidTYVNSaN6sbxG15nSgS0jYysE,22531
|
|
14
|
+
raidlock/guard.py,sha256=rRKKCnHzSBkdBr6B8s1Aa6vTEpQTDzKugG6AeqOs5GU,8154
|
|
15
|
+
raidlock/hooks.py,sha256=YgGnyhh23Tl5SZ0-QW7vBB6ouioElMuVDDBZSLmQzmI,55670
|
|
16
|
+
raidlock/infer.py,sha256=dv45xVSYsNwEEj19x3GS19gfSkUq9N01_X_UvTdhZcs,8661
|
|
17
|
+
raidlock/limits.py,sha256=7o7ZAiDd3HpV63U9FShdGfMhWQeuBFJiATWMw5j89ns,25048
|
|
18
|
+
raidlock/notify.py,sha256=Cx4kUucVspIJT4162cFWpeFNhmLqx2phGKsVrU8OIo8,5813
|
|
19
|
+
raidlock/party.py,sha256=5oyNAJ36_0BTIuUo3HhAT9kwC2JFHAKa26oNq884MTQ,8261
|
|
20
|
+
raidlock/pr.py,sha256=JA0BFIEuNuXyu-Ax1Fy1HHQjZgqMLRw8PmYlVgsGGp0,25013
|
|
21
|
+
raidlock/prsync.py,sha256=OXkcxpJsjaWi5bTLgEHvRby519yz9jsXJd2kZqolqPM,13524
|
|
22
|
+
raidlock/reputation.py,sha256=FWJHe91y66JdVjBEMILrKFghUxY3_gXWGytOvPS2waQ,8812
|
|
23
|
+
raidlock/resume.py,sha256=RRGRulsFi6StlJTequ5jcevGguKIYmoVkmSySV_L0-U,14177
|
|
24
|
+
raidlock/resurrect.py,sha256=kT2Zxux2162-bTuls44-1Va8UyFG2dbQX9WfNeQgfYo,17951
|
|
25
|
+
raidlock/routing.py,sha256=E4AGHx-SFyae94SwwsoERBW5i_IQiu5_fb8DuNzDps4,17920
|
|
26
|
+
raidlock/scan.py,sha256=3dizzFjVzlpVrKsD7-MnSey0reuxeSgcM4Z6WYNchRQ,14559
|
|
27
|
+
raidlock/snapshot.py,sha256=oPsp3WY1r01-Ja8gRSfjBkxhcd8YQnVi4gkmjpXiBgw,6225
|
|
28
|
+
raidlock/treasury.py,sha256=eABJ5xIu3zQf5uPHfog02Kkguo8FF3gyf1Q1ksVMTYw,8201
|
|
29
|
+
raidlock/tui.py,sha256=PQrxZ5KFT-wcvTE4mBmzAMqHaQo_IzXFmAFb-yX6yKk,7177
|
|
30
|
+
raidlock/bridge/__init__.py,sha256=t0Y0Kz73aAWy5xIcppYH9vovAuvjScz5QFw5HCFQI6w,5630
|
|
31
|
+
raidlock/core/__init__.py,sha256=LIKQPJ2ePsg13lM7WKitIMBghUtV7uUwGn0G5ND0XuA,663
|
|
32
|
+
raidlock/core/advisories.py,sha256=hdoun4o-OzK-8-niFpm5eW2xUjjQz5b7nM3Sujqi5Bc,523
|
|
33
|
+
raidlock/core/billing.py,sha256=TLqiiJ_0oEMEk-lLKEMEEnGz1Tsl3IsOkXuLT73yHoc,2087
|
|
34
|
+
raidlock/core/board.py,sha256=dQdZGq6oQXWMwMu-YnTZNSVewpNjf9ktP5edLYPYXek,99191
|
|
35
|
+
raidlock/core/brief.py,sha256=bYj8eRoBirkQwILs2CS8KDHSf9cemBGkCHmKhmZT54Q,3704
|
|
36
|
+
raidlock/core/clock.py,sha256=wCpNFZ__qWUAltg6Z4xfpKC5CC9GvDebFSnqNZPtVR8,813
|
|
37
|
+
raidlock/core/cost.py,sha256=aJkvXED85qVRi13UUDY49Js3kmaxrMNFCkhCmaN5k84,6591
|
|
38
|
+
raidlock/core/db.py,sha256=YIQlbcru73vV5YAO_v-OIOyFOPy_d6wVVRTXQ8iMXGA,25777
|
|
39
|
+
raidlock/core/errors.py,sha256=MImXFRrFCnH6PyjtCnnL5dYwBGDkqCAjWLAdia4Lu1w,1295
|
|
40
|
+
raidlock/core/exe.py,sha256=HFf3EszzRqUMD6FwcECH3fU_IGUQDVoSP8iex8jzeSA,184
|
|
41
|
+
raidlock/core/hints.py,sha256=jIU7IFHIdIiYUemyVQaKOBNtNIs8p5ZDzbum6k4uMdI,972
|
|
42
|
+
raidlock/core/identity.py,sha256=QKcq-F1u6ZG8kOXoJswkG-7o_LeMRtQBPbkBb7vbYVM,10382
|
|
43
|
+
raidlock/core/lead.py,sha256=Fi6EqJJ1CE2jnvj4-JSBY1JsTtNDF6mesXFpjBpLtb0,27698
|
|
44
|
+
raidlock/core/lead_env.py,sha256=QHUJ27i7w-5G8bFppHVY3Y3n1XIa0Lb8X2cNUYjbC0A,752
|
|
45
|
+
raidlock/core/lead_hook.py,sha256=FQ8UcOMyYZhgamPULTL1Et9Hc-WZMfo_ecraX3wL3uY,1562
|
|
46
|
+
raidlock/core/leases.py,sha256=Ow1B1Bnm8JaaTOPR3gfnH52CJiH9ZLVm48NeQuNW6Og,604
|
|
47
|
+
raidlock/core/lock.py,sha256=HV5GSVXuBHDEEqe9CVaBZNXS4fY5XZ_lkdnryasKAAg,2762
|
|
48
|
+
raidlock/core/messages.py,sha256=-0s31Qf_oXNJ6wRGZbCLZqmhSH55lS3zqq1u1pzRkbs,3155
|
|
49
|
+
raidlock/core/migrate.py,sha256=ZZk_4hAjfLoCUAZPSt1Sln6QjKWH9cWiEkMePR4tjwM,20997
|
|
50
|
+
raidlock/core/model.py,sha256=K95uGDSTDta4rtlsv8VBRiydVGM8IZyfQbK6uJwQzeo,4355
|
|
51
|
+
raidlock/core/models.py,sha256=5EV1VR_Fws4MdAfaLSll8VsoGVbQ8CpAWUH4PM7Qdjk,3689
|
|
52
|
+
raidlock/core/paths.py,sha256=xeAsqVGsbm_H9jgFF-E_rhpcKWhCtwJ7kpYvKctDans,2021
|
|
53
|
+
raidlock/core/portable.py,sha256=TZBJ3wcJGjF1Y2sXBo0wI-FW6ZLjI5D9FqX4lQe-7Q4,1647
|
|
54
|
+
raidlock/core/receipts.py,sha256=FsF8w9gDTWYvrReaPWhRSo7yhNon40Liy0Hhn6PLkZs,2605
|
|
55
|
+
raidlock/core/registry.py,sha256=ea1Vz7FcuhdRtHGgbvLssizmsQWr2Cq932U-6bagCwM,1259
|
|
56
|
+
raidlock/core/repos.py,sha256=xFNnM3GEwIyV9DBxK0Vr83ejBGcZBWYQnAEbFJCNbu4,8203
|
|
57
|
+
raidlock/core/safeio.py,sha256=Lri5WusWF_hn8whb7kMuJyBBkCEIVIWgdWAu5VWFFyc,6650
|
|
58
|
+
raidlock/core/status.py,sha256=X3wJbooT8yWoAJkhoFCFZwM8daRC7aXM02qlxnq85bY,1916
|
|
59
|
+
raidlock/core/store.py,sha256=UnvsmZxwfmN8iDros53ywAYTn6N6m1gL7_ThMHjqzTg,2794
|
|
60
|
+
raidlock/core/tokens.py,sha256=fzRcLvASo6F-xFNmbCMh85mn7NgGNQQ5HgSUUZcaR6g,2767
|
|
61
|
+
raidlock/core/transcript.py,sha256=iBNFMrfACmhO_JtB-bdrhsAS-nJtCp4ufIvqXVkxJUQ,7719
|
|
62
|
+
raidlock/lore/__init__.py,sha256=UhY_l9HG3IecmWrpxaSYFkT1bSxE8p_ZLRDx34MFrEw,901
|
|
63
|
+
raidlock/lore/approval.py,sha256=3SLwkplJDr58LxoNEzJ8cUlSLA3qgVOFWwxhciJaKFU,5170
|
|
64
|
+
raidlock/lore/capture.py,sha256=Dq5T_G733VVmiPh7PoNkHlkVBoYKw_noyTZWJKzeQRQ,5139
|
|
65
|
+
raidlock/lore/cli.py,sha256=YqIEFMtKNIG2QoiQfuagUoFQDYLHtQa10cLt2uuOVd4,5261
|
|
66
|
+
raidlock/lore/distill.py,sha256=FjHXrIxqCGpRQ5DXrOejqcgrviBI7QCr7RANmVu6u9k,929
|
|
67
|
+
raidlock/lore/frontmatter.py,sha256=wfrkyZ6ax91_RtqBIwrSIuUn25HoK4O-mIpzPCvtUX4,2016
|
|
68
|
+
raidlock/lore/inject.py,sha256=0SrxFK9p4QqCQdsatSBlHZFmlRiPe9U--fycmxlTcL4,4971
|
|
69
|
+
raidlock/lore/vault.py,sha256=hZ-M_xEI5FWRZtuhoFDBaMfMRJ4D2dsuR6cbLCV3i8M,8790
|
|
70
|
+
raidlock/mcp/__init__.py,sha256=EGqqhzzvOWvxOdMdwHtKSAU-vt0bgjZsQDmXQ0HQd4E,948
|
|
71
|
+
raidlock/mcp/resources.py,sha256=36ssQuw7ymBXv8Jcm-3XQccbiFSABu3gY7uhdEceGc8,2135
|
|
72
|
+
raidlock/mcp/server.py,sha256=i9q0somPJhJhzmUo9e-fS7ziGHtIoosLxdgOGIqzaco,7149
|
|
73
|
+
raidlock/mcp/tools.py,sha256=LXyXxhnzL6qMAC0dVfDXNZ0YVqFgyr6VSV--j1CebD4,6542
|
|
74
|
+
raidlock/recipes/README.md,sha256=QVApzrGviEOgSzv9NcAC6U4kalC8zS9wi8Da9RhTDlM,1934
|
|
75
|
+
raidlock/recipes/__init__.py,sha256=NOUFZYqtGyaJ-Fm2nhhHT_jewUkNHbTgPxFGmffDvB8,3728
|
|
76
|
+
raidlock/recipes/docs-refresh.md,sha256=nFHsg-u-dAXQdavi50OUwSQa-kMB-_K32xBoF8xosfY,660
|
|
77
|
+
raidlock/recipes/multi-repo-refactor.md,sha256=wpmoHMNUHYIBbm7NTNlvQ7iLeGsNZi7CQk_rkf6lRag,866
|
|
78
|
+
raidlock/recipes/security-audit.md,sha256=K-CSZmEQvEH9HMGVRjixeVd1i7FqN1OpcoJmjFBuX7A,2248
|
|
79
|
+
raidlock/recipes/upgrade-deps.md,sha256=414le8C8gkLG4phHqZu4IMR96ocCDKWs6uNjKPS2AyA,792
|
|
80
|
+
raidlock/runners/__init__.py,sha256=Mds2miY-c2ypvUy_FzNbDQWseKebSWyaOf1sD03XXbg,522
|
|
81
|
+
raidlock/runners/base.py,sha256=sjH9PQBF4VUbJDGeK4kede0huCyv5hFLF_iMikxbQ9I,11217
|
|
82
|
+
raidlock/runners/brief.py,sha256=1SizkW9lvu8zaksdOwr9oUljMr1Xj9Eo6-eyQ3gZww4,6749
|
|
83
|
+
raidlock/runners/claude_code.py,sha256=sD_PPMYWYP3Y6DclMQPGjCGioDCnJdwTgIpHWISZH58,4705
|
|
84
|
+
raidlock/runners/cli.py,sha256=5OBGCMz_Tfn2tyE0a4VVj0dqS0Qic2pLkyzQboNhJks,3857
|
|
85
|
+
raidlock/runners/codex.py,sha256=QWANAB20Rt5bYafAoOA59_z7kkvNCoz2S2Kz8riEIjw,4023
|
|
86
|
+
raidlock/runners/gemini.py,sha256=dfiOC9PvRQr9M5BU6OUrAw3CkciXQOwRHoHHD-AfV4k,2435
|
|
87
|
+
raidlock/runners/isolation.py,sha256=LiQgXmIebi6Ykg5X_alYKd2aVUWDXGhSKxv23uZL6Kc,13405
|
|
88
|
+
raidlock/runners/policy.py,sha256=BPaueMX8jmepq9dLA8pxlzr-xxszU24hNFIPYSyjul8,4377
|
|
89
|
+
raidlock/runners/runner.py,sha256=3c0V-hhTxTowM8QPvokPpFZtdPBlhprxYSfVorWbyvI,34356
|
|
90
|
+
raidlock/runners/shell.py,sha256=bSNiN6Vhd2G-I91hArGKWIPg9lpqoNO1rihzy9O2jgM,1261
|
|
91
|
+
raidlock/runners/verifycache.py,sha256=KfYKrjQIccO9ZEZIP00mMy9fwD3InrEn0qeycfFcTQw,2972
|
|
92
|
+
raidlock/runners/workspace.py,sha256=iB5MTPjQVjgixqtJMj17gr6xR6wJDNJKj63VTxRZQPk,13763
|
|
93
|
+
raidlock/web/__init__.py,sha256=DsHwSg_2bScluKbuk8eA9GfR0BNbLOz_lJSW5n3-3PY,110
|
|
94
|
+
raidlock/web/cli.py,sha256=LpwFBHMhxhAImutmFEjGIe4htvyEGtB4DVDrtt4I2M4,2991
|
|
95
|
+
raidlock/web/data.py,sha256=R7BkkEB75IkrxePleIlX9jbDIIpZqKIewadEK973FIQ,23906
|
|
96
|
+
raidlock/web/export.py,sha256=3r-JZIh3gfcBfNFNWe48M7truA27vSEzyvGObeEj7Pc,5600
|
|
97
|
+
raidlock/web/server.py,sha256=DRwsY4MFCRlcWP81M_X_NFSF71BIA3fck4IY7XrJFNU,10673
|
|
98
|
+
raidlock/web/achievements/view.css,sha256=FXpzF57AyI2CVrGGk402zNGYeDn_6UBs7H_MHmh1SUc,1380
|
|
99
|
+
raidlock/web/achievements/view.js,sha256=OhhacUcaeS0LjolZ1o2wUK7fMk2B2l4oJ5LXkRzaMsE,4155
|
|
100
|
+
raidlock/web/bosses/view.css,sha256=4OQsAbrWxFTsDQ3Xf_jqrJvmqf32Zt8cPjWUqEAxa5g,1331
|
|
101
|
+
raidlock/web/bosses/view.js,sha256=8rkDjrDhHRRRwN-HA7B8GnclQV_63VvEOPqaWxQbnrI,2988
|
|
102
|
+
raidlock/web/frames/view.css,sha256=yGjGlismw0ZJJqb8FQdj1vDArtT00oVl5hMxWBCKDXs,2024
|
|
103
|
+
raidlock/web/frames/view.js,sha256=MTNbGWdLycDayCrGMuhqm9Yyttj79OGLZ7P_GnTDv8E,4389
|
|
104
|
+
raidlock/web/graph/__init__.py,sha256=0-GQbuPfejJP8mddYCWC-bBmsQdsc1tutmglJS85lyc,5313
|
|
105
|
+
raidlock/web/graph/view.css,sha256=A_nGLuXACwm61R6b2ShezMw2c8x8Qf_25tTEJDcPsxY,2337
|
|
106
|
+
raidlock/web/graph/view.js,sha256=rlBbjW3GnbnLNKmldF_PKSaYBct8EHyCG8Jomh-9KEI,9515
|
|
107
|
+
raidlock/web/raidmap/__init__.py,sha256=yi8CI5IaSdjMkO7_2S8xbgCgAh33TrH0HXju4TMQhr4,7365
|
|
108
|
+
raidlock/web/raidmap/view.css,sha256=HpEJ7Ypnggn10YKgWsYvcaxfxo1vHlrxk5npOQZzuls,1450
|
|
109
|
+
raidlock/web/raidmap/view.js,sha256=yl6HIxk4s3BCN3Lri18tx8ihP0WvjqLCjsHOKvd_cnY,3067
|
|
110
|
+
raidlock/web/replay/__init__.py,sha256=ogZnomgZc3O17FygUpQNadAdfNUsHHFaWnHwBHFfQfw,9681
|
|
111
|
+
raidlock/web/replay/view.css,sha256=0JLsxfyvKHNjVsvLzRW7lLy4JV_r1js9rqnOzowC-EI,1368
|
|
112
|
+
raidlock/web/replay/view.js,sha256=tvBjTXNcz7d7yHW8pg9t-lqtwcuLrGgk66tk_42HO8Q,6683
|
|
113
|
+
raidlock/web/static/app.css,sha256=zI9BXaf-Bp13y0yvn8wMO4hZegwKPtCzalk6-KM2868,60591
|
|
114
|
+
raidlock/web/static/app.js,sha256=2YkXtAlIEbAUu6gG647eV4iYjkWbIeBYjG9rTGgyMSQ,128156
|
|
115
|
+
raidlock/web/static/icon-32.png,sha256=oEfu2Ihu1KMRDmVAKn9vRLrK34AsIoIcSDp2RvLB9ys,966
|
|
116
|
+
raidlock/web/static/icon-raid.svg,sha256=J9_2ifw2M0B1Awct__D3hkSwLWsgUuWLSK1_aH5aA2g,817
|
|
117
|
+
raidlock/web/static/icon.svg,sha256=NdW-8qu6GY1oLMhszxn5cmsmhKhiF9ElP1r5Ok-LLzo,624
|
|
118
|
+
raidlock/web/static/index.html,sha256=pZOHmAF8W2_p4DKtb2rz97BogJ5LxLotzp7jFZ9xFD0,11973
|
|
119
|
+
raidlock/web/static/fonts/OFL.txt,sha256=9aJCz2itbr0GA7M1mnTFk8oIAximgQNb5SlrosawSuY,4382
|
|
120
|
+
raidlock/web/static/fonts/cinzel-600.woff2,sha256=HHIG0um8WV9rQ5Z3hOm-QNVipHROdzUaV65nSjVbn3c,14776
|
|
121
|
+
raidlock/web/static/fonts/cinzel-700.woff2,sha256=92NIW5niCaaLMkL_2DzfMIBf7JGhEsiSjE8uCNqpYuI,14684
|
|
122
|
+
raidlock-0.1.0.dist-info/METADATA,sha256=gIlpq8schxvtSwZ9GvQvNPIq3vDDp4zuXm8ZNfUQRhE,11824
|
|
123
|
+
raidlock-0.1.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
|
|
124
|
+
raidlock-0.1.0.dist-info/entry_points.txt,sha256=N6s6GxFTXfJUQEvO5O8Q9-471urn_sV1dmCmEGnb-Hk,1230
|
|
125
|
+
raidlock-0.1.0.dist-info/licenses/LICENSE,sha256=XgN2OpjVTxctR9B3zwXktyrf0DLWFoMLAjnqQkw2G3E,1070
|
|
126
|
+
raidlock-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
[console_scripts]
|
|
2
|
+
raid = raidlock.cli:main
|
|
3
|
+
raidlock = raidlock.cli:main
|
|
4
|
+
|
|
5
|
+
[raidlock.commands]
|
|
6
|
+
achievements = raidlock.achievements:register_cli
|
|
7
|
+
approvals = raidlock.approvals:register_cli
|
|
8
|
+
bench = raidlock.bench:register_cli
|
|
9
|
+
budget = raidlock.budgets:register_cli
|
|
10
|
+
delegate = raidlock.runners.cli:register_cli
|
|
11
|
+
duel = raidlock.duel:register_cli
|
|
12
|
+
foresight = raidlock.foresight:register_cli
|
|
13
|
+
frames = raidlock.frames:register_cli
|
|
14
|
+
graph = raidlock.web.graph:register_cli
|
|
15
|
+
guard = raidlock.guard:register_cli
|
|
16
|
+
limits = raidlock.limits:register_cli
|
|
17
|
+
lore = raidlock.lore.cli:register_cli
|
|
18
|
+
map = raidlock.web.raidmap:register_cli
|
|
19
|
+
mcp = raidlock.mcp:register_cli
|
|
20
|
+
next = raidlock.routing:register_cli
|
|
21
|
+
notify = raidlock.notify:register_cli
|
|
22
|
+
pr = raidlock.pr:register_cli
|
|
23
|
+
pr-sync = raidlock.prsync:register_cli
|
|
24
|
+
recipes = raidlock.recipes:register_cli
|
|
25
|
+
replay = raidlock.web.replay:register_cli
|
|
26
|
+
reputation = raidlock.reputation:register_cli
|
|
27
|
+
resume = raidlock.resume:register_cli
|
|
28
|
+
resurrect = raidlock.resurrect:register_cli
|
|
29
|
+
scan = raidlock.scan:register_cli
|
|
30
|
+
snapshot = raidlock.snapshot:register_cli
|
|
31
|
+
suggest-locks = raidlock.infer:register_cli
|
|
32
|
+
treasury = raidlock.treasury:register_cli
|
|
33
|
+
tui = raidlock.tui:register_cli
|
|
34
|
+
ui = raidlock.web.cli:register_cli
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Gabriel Arcas
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|