tmscli 0.2.9__tar.gz → 0.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tmscli-0.2.9 → tmscli-0.3.1}/PKG-INFO +1 -1
- tmscli-0.3.1/README.md +11 -0
- {tmscli-0.2.9 → tmscli-0.3.1}/pyproject.toml +1 -3
- tmscli-0.3.1/src/tmscli/__init__.py +0 -0
- tmscli-0.3.1/src/tmscli/about.html +76 -0
- tmscli-0.3.1/src/tmscli/index.html +51 -0
- tmscli-0.3.1/src/tmscli/install.html +77 -0
- {tmscli-0.2.9 → tmscli-0.3.1}/src/tmscli/main.py +38 -36
- tmscli-0.3.1/src/tmscli/style.css +306 -0
- tmscli-0.3.1/update.sh +25 -0
- tmscli-0.2.9/README.md +0 -2
- tmscli-0.2.9/update.sh +0 -19
- /tmscli-0.2.9/src/tmscli/__init__.py → /tmscli-0.3.1/src/tmscli/.gitkeep +0 -0
tmscli-0.3.1/README.md
ADDED
|
@@ -4,11 +4,9 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tmscli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.3.1"
|
|
8
8
|
description = "runs minesweeper in your terminal, type rules for how to play"
|
|
9
9
|
dependencies = []
|
|
10
10
|
|
|
11
11
|
[project.scripts]
|
|
12
12
|
tms = "tmscli.main:run"
|
|
13
|
-
rules = "tmscli.main:print_rules"
|
|
14
|
-
|
|
File without changes
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>about · tmscli</title>
|
|
7
|
+
<link rel="stylesheet" href="style.css">
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<header>
|
|
11
|
+
<div class="header-inner">
|
|
12
|
+
<div class="logo">tmscli</div>
|
|
13
|
+
<nav>
|
|
14
|
+
<a href="index.html">main</a>
|
|
15
|
+
<a href="about.html" class="active">about</a>
|
|
16
|
+
<a href="install.html">installation + usage</a>
|
|
17
|
+
</nav>
|
|
18
|
+
</div>
|
|
19
|
+
</header>
|
|
20
|
+
|
|
21
|
+
<main class="container">
|
|
22
|
+
<h1>about tmscli</h1>
|
|
23
|
+
<p class="subhead">A fun little project from 2024 to see who could code faster</p>
|
|
24
|
+
|
|
25
|
+
<div class="about-section">
|
|
26
|
+
<h2>Philosophy</h2>
|
|
27
|
+
<p>tmscli started as a fun competition to see whether python or C++ could make minesweeper faster and run smoother, now the python version has been uploaded to PyPi and can be downloaded using pip.</p>
|
|
28
|
+
<p>It is inteded to engage people into what coding can get you and should not be used to personal advantage (not sure how, but it's a must say)</p>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="about-section">
|
|
32
|
+
<h2>Behind the scenes</h2>
|
|
33
|
+
<p>tmscli is fully python and relies on random to build the minefield</p>
|
|
34
|
+
<p>lets take a look at some code</p>
|
|
35
|
+
<pre><code> while True:
|
|
36
|
+
terminal_minesweeper.print_board(board)
|
|
37
|
+
cmd=input()
|
|
38
|
+
cmds=cmd.split()
|
|
39
|
+
if int(cmds[1])>terminal_minesweeper.size or int(cmds[1])<0 or int(cmds[2])>terminal_minesweeper.size or int(cmds[2])<0:
|
|
40
|
+
print('coordinate out of range, please try again')
|
|
41
|
+
if cmds[0]=='uc':
|
|
42
|
+
if (not board[int(cmds[1])-1][int(cmds[2])-1][0]) and (not board[int(cmds[1])-1][int(cmds[2])-1][1]):
|
|
43
|
+
board[int(cmds[1])-1][int(cmds[2])-1][0]=True
|
|
44
|
+
if board[int(cmds[1])-1][int(cmds[2])-1][2]==0:
|
|
45
|
+
board=terminal_minesweeper.richochet(board,(int(cmds[1])-1,int(cmds[2])-1))
|
|
46
|
+
else:
|
|
47
|
+
print('already uncovered')
|
|
48
|
+
elif cmds[0]=='fl':
|
|
49
|
+
if not board[int(cmds[1])-1][int(cmds[2])-1][1]:
|
|
50
|
+
board[int(cmds[1])-1][int(cmds[2])-1][1]=True
|
|
51
|
+
else:
|
|
52
|
+
print('already flagged')
|
|
53
|
+
elif cmds[0]=='uf':
|
|
54
|
+
if board[int(cmds[1])-1][int(cmds[2])-1][2]:
|
|
55
|
+
board[int(cmds[1])-1][int(cmds[2])-1][0]=False
|
|
56
|
+
else:
|
|
57
|
+
print('already not flagged')
|
|
58
|
+
else:
|
|
59
|
+
print('unrecognised command, please try again')
|
|
60
|
+
terminal_minesweeper.check(board)</code></pre>
|
|
61
|
+
<p>This is a rather large chunk of code, and is what the main loop does</p>
|
|
62
|
+
<p>as you can see it has three commands, uc, fl, and uf. Each doing something different. If it does not think the input is valid, it will output what it thinks the error is. (May be inaccurate)</p>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<div class="about-section">
|
|
66
|
+
<h2>Github Repository</h2>
|
|
67
|
+
<p>tmscli is 100% owned by a-humanly-human.</p>
|
|
68
|
+
<p>Link to Repository: <a href="https://github.com/a-humanly-human/terminal-minesweeper/">https://github.com/a-humanly-human/terminal-minesweeper/</a></p>
|
|
69
|
+
</div>
|
|
70
|
+
</main>
|
|
71
|
+
|
|
72
|
+
<footer>
|
|
73
|
+
<p>tmscli · PyPI module · lorem ipsum placeholder</p>
|
|
74
|
+
</footer>
|
|
75
|
+
</body>
|
|
76
|
+
</html>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>tmscli · PyPI module</title>
|
|
7
|
+
|
|
8
|
+
<link rel="stylesheet" href="style.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<header>
|
|
12
|
+
<div class="header-inner">
|
|
13
|
+
<div class="logo">tmscli</div>
|
|
14
|
+
<nav>
|
|
15
|
+
<a href="index.html" class="active">main</a>
|
|
16
|
+
<a href="about.html">about</a>
|
|
17
|
+
<a href="install.html">installation + usage</a>
|
|
18
|
+
</nav>
|
|
19
|
+
</div>
|
|
20
|
+
</header>
|
|
21
|
+
|
|
22
|
+
<main class="container">
|
|
23
|
+
<h1>tmscli</h1>
|
|
24
|
+
<p class="subhead">minesweeper, in your terminal, all at once</p>
|
|
25
|
+
|
|
26
|
+
<div class="card-grid">
|
|
27
|
+
<div class="card">
|
|
28
|
+
<h2>Quick start</h2>
|
|
29
|
+
<p>Visit the install page for installation, and see about for info</p>
|
|
30
|
+
<p></p>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="card">
|
|
33
|
+
<h2>Why tmscli?</h2>
|
|
34
|
+
<p>Bored of sitting there, with all your work done, but unable to do anything?</p>
|
|
35
|
+
<p>tmscli brings in minesweeper to the terminal and is customisable to make it suitable for you</p>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<div class="lorem-block">
|
|
40
|
+
<h2>Latest updates</h2>
|
|
41
|
+
<p>v0.3.0 added border to the minesweeper format and minor bug fixes</p>
|
|
42
|
+
</div>
|
|
43
|
+
</main>
|
|
44
|
+
|
|
45
|
+
<footer>
|
|
46
|
+
<p>tmscli · PyPI module</p>
|
|
47
|
+
</footer>
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
</body>
|
|
51
|
+
</html>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>installation + usage · tmscli</title>
|
|
7
|
+
<link rel="stylesheet" href="style.css">
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<header>
|
|
11
|
+
<div class="header-inner">
|
|
12
|
+
<div class="logo">tmscli</div>
|
|
13
|
+
<nav>
|
|
14
|
+
<a href="index.html">main</a>
|
|
15
|
+
<a href="about.html">about</a>
|
|
16
|
+
<a href="install.html" class="active">installation + usage</a>
|
|
17
|
+
</nav>
|
|
18
|
+
</div>
|
|
19
|
+
</header>
|
|
20
|
+
|
|
21
|
+
<main class="container">
|
|
22
|
+
<h1>installation & usage</h1>
|
|
23
|
+
<p class="subhead">A guide on how to install tmscli from pypi to how to customise number of mines and the size of the board.</p>
|
|
24
|
+
|
|
25
|
+
<div class="install-card">
|
|
26
|
+
<h2>Install from PyPI</h2>
|
|
27
|
+
<pre><code>pip install tmscli</code></pre>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="usage-section">
|
|
31
|
+
<h2>Basic usage</h2>
|
|
32
|
+
<pre><code>tms</code></pre>
|
|
33
|
+
<p>Launches the basic 9x9 board with 10 mines</p>
|
|
34
|
+
|
|
35
|
+
<h2>Size</h2>
|
|
36
|
+
<pre><code>tms -s SIZE</code></pre>
|
|
37
|
+
<p>customises the boards size</p>
|
|
38
|
+
|
|
39
|
+
<h2>Number of mines</h2>
|
|
40
|
+
<pre><code>tms -m NUM</code></pre>
|
|
41
|
+
<p>customises number of mines</p>
|
|
42
|
+
|
|
43
|
+
<h2>Rules</h2>
|
|
44
|
+
<pre><code>tms -r</code></pre>
|
|
45
|
+
<p>prints the rules</p>
|
|
46
|
+
<h2>In-game commands</h2>
|
|
47
|
+
<pre><code>uc x y</code></pre>
|
|
48
|
+
<p>uncovers square (x,y)</p>
|
|
49
|
+
<pre><code>fl x y</code></pre>
|
|
50
|
+
<p>flags square (x,y)</p>
|
|
51
|
+
<pre><code>uf x y</code></pre>
|
|
52
|
+
<p>unflags square (x,y)</p>
|
|
53
|
+
<p>Note:</p>
|
|
54
|
+
<p> y------->
|
|
55
|
+
<br>
|
|
56
|
+
x
|
|
57
|
+
<br>
|
|
58
|
+
|
|
|
59
|
+
<br>
|
|
60
|
+
|
|
|
61
|
+
<br>
|
|
62
|
+
|
|
|
63
|
+
<br>
|
|
64
|
+
|
|
|
65
|
+
<br>
|
|
66
|
+
V
|
|
67
|
+
</p>
|
|
68
|
+
<p>use <pre><code>tms -r</code></pre> for a full guide</p>
|
|
69
|
+
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
<footer>
|
|
74
|
+
<p>tmscli · PyPI module</p>
|
|
75
|
+
</footer>
|
|
76
|
+
</body>
|
|
77
|
+
</html>
|
|
@@ -6,15 +6,10 @@ class minesweeper():
|
|
|
6
6
|
self.num=num
|
|
7
7
|
['uncovered?','flagged?','display']
|
|
8
8
|
def print_board(self,board):
|
|
9
|
-
top=(
|
|
9
|
+
top=' '+(self.size*2)*'_'
|
|
10
|
+
print(top)
|
|
10
11
|
for i in range(self.size):
|
|
11
|
-
|
|
12
|
-
print(top[:-1])
|
|
13
|
-
for i in range(self.size):
|
|
14
|
-
if 100>i>9:
|
|
15
|
-
buffer=str(i+1)+' '
|
|
16
|
-
else:
|
|
17
|
-
buffer=str(i+1)+' '
|
|
12
|
+
buffer='| '
|
|
18
13
|
for j in board[i]:
|
|
19
14
|
if j[0]==True:
|
|
20
15
|
buffer+=str(j[2])+' '
|
|
@@ -22,7 +17,9 @@ class minesweeper():
|
|
|
22
17
|
buffer+='F'+' '
|
|
23
18
|
else:
|
|
24
19
|
buffer+=' '+' '
|
|
25
|
-
print(buffer[:-1])
|
|
20
|
+
print(buffer[:-1]+'|')
|
|
21
|
+
bottom=' '+(len(top)-1)*'-'
|
|
22
|
+
print(bottom)
|
|
26
23
|
def get_mines(self):
|
|
27
24
|
mines=[]
|
|
28
25
|
while len(mines)<self.num:
|
|
@@ -107,32 +104,37 @@ class minesweeper():
|
|
|
107
104
|
terminal_minesweeper=minesweeper(9,5)
|
|
108
105
|
# terminal_minesweeper.print_board(board)
|
|
109
106
|
def main_loop(board):
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if
|
|
118
|
-
board[int(cmds[1])-1][int(cmds[2])-1][0]
|
|
119
|
-
|
|
120
|
-
board
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
board[int(cmds[1])-1][int(cmds[2])-1][1]
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
board[int(cmds[1])-1][int(cmds[2])-1][
|
|
107
|
+
try:
|
|
108
|
+
while True:
|
|
109
|
+
terminal_minesweeper.print_board(board)
|
|
110
|
+
cmd=input()
|
|
111
|
+
cmds=cmd.split()
|
|
112
|
+
if int(cmds[1])>terminal_minesweeper.size or int(cmds[1])<0 or int(cmds[2])>terminal_minesweeper.size or int(cmds[2])<0:
|
|
113
|
+
print('coordinate out of range, please try again')
|
|
114
|
+
if cmds[0]=='uc':
|
|
115
|
+
if (not board[int(cmds[1])-1][int(cmds[2])-1][0]) and (not board[int(cmds[1])-1][int(cmds[2])-1][1]):
|
|
116
|
+
board[int(cmds[1])-1][int(cmds[2])-1][0]=True
|
|
117
|
+
if board[int(cmds[1])-1][int(cmds[2])-1][2]==0:
|
|
118
|
+
board=terminal_minesweeper.richochet(board,(int(cmds[1])-1,int(cmds[2])-1))
|
|
119
|
+
else:
|
|
120
|
+
print('already uncovered')
|
|
121
|
+
elif cmds[0]=='fl':
|
|
122
|
+
if not board[int(cmds[1])-1][int(cmds[2])-1][1]:
|
|
123
|
+
board[int(cmds[1])-1][int(cmds[2])-1][1]=True
|
|
124
|
+
else:
|
|
125
|
+
print('already flagged')
|
|
126
|
+
elif cmds[0]=='uf':
|
|
127
|
+
if board[int(cmds[1])-1][int(cmds[2])-1][2]:
|
|
128
|
+
board[int(cmds[1])-1][int(cmds[2])-1][0]=False
|
|
129
|
+
else:
|
|
130
|
+
print('already not flagged')
|
|
131
131
|
else:
|
|
132
|
-
print('
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
132
|
+
print('unrecognised command, please try again')
|
|
133
|
+
terminal_minesweeper.check(board)
|
|
134
|
+
except KeyboardInterrupt:
|
|
135
|
+
print('Interrupted')
|
|
136
|
+
except:
|
|
137
|
+
print('ERROR')
|
|
136
138
|
def run():
|
|
137
139
|
p=argparse.ArgumentParser(description='Minesweeper CLI')
|
|
138
140
|
p.add_argument(
|
|
@@ -178,8 +180,8 @@ x
|
|
|
178
180
|
|
|
|
179
181
|
V
|
|
180
182
|
Aim:
|
|
181
|
-
uncover every square without a mine on it
|
|
183
|
+
uncover every square without a mine on it.
|
|
182
184
|
|
|
183
185
|
If you step on a mine you lose, the number on the square is how many mines are around it (3 x 3 radius)
|
|
184
186
|
''')
|
|
185
|
-
run()
|
|
187
|
+
# run()
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/* style.css — shared across all pages */
|
|
2
|
+
|
|
3
|
+
* {
|
|
4
|
+
margin: 0;
|
|
5
|
+
padding: 0;
|
|
6
|
+
box-sizing: border-box;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
body {
|
|
10
|
+
font-family: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
|
|
11
|
+
background: #f8fafc;
|
|
12
|
+
color: #0b1e2e;
|
|
13
|
+
line-height: 1.6;
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
min-height: 100vh;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* header & navigation */
|
|
20
|
+
header {
|
|
21
|
+
background: #0f2b3d;
|
|
22
|
+
color: #e2e8f0;
|
|
23
|
+
border-bottom: 3px solid #2d7a9b;
|
|
24
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.header-inner {
|
|
28
|
+
max-width: 1100px;
|
|
29
|
+
margin: 0 auto;
|
|
30
|
+
padding: 1rem 2rem;
|
|
31
|
+
display: flex;
|
|
32
|
+
flex-wrap: wrap;
|
|
33
|
+
align-items: center;
|
|
34
|
+
justify-content: space-between;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.logo {
|
|
38
|
+
font-size: 1.8rem;
|
|
39
|
+
font-weight: 600;
|
|
40
|
+
letter-spacing: -0.5px;
|
|
41
|
+
color: #ffffff;
|
|
42
|
+
background: linear-gradient(135deg, #b4e6ff, #8ecae6);
|
|
43
|
+
-webkit-background-clip: text;
|
|
44
|
+
background-clip: text;
|
|
45
|
+
-webkit-text-fill-color: transparent;
|
|
46
|
+
text-shadow: 0 0 6px rgba(142, 202, 230, 0.3);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
nav {
|
|
50
|
+
display: flex;
|
|
51
|
+
gap: 1.8rem;
|
|
52
|
+
flex-wrap: wrap;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
nav a {
|
|
56
|
+
color: #cbd5e1;
|
|
57
|
+
text-decoration: none;
|
|
58
|
+
font-weight: 500;
|
|
59
|
+
font-size: 1rem;
|
|
60
|
+
padding: 0.25rem 0;
|
|
61
|
+
border-bottom: 2px solid transparent;
|
|
62
|
+
transition: border-color 0.15s, color 0.15s;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
nav a:hover {
|
|
66
|
+
color: #ffffff;
|
|
67
|
+
border-bottom-color: #8ecae6;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
nav a.active {
|
|
71
|
+
color: #ffffff;
|
|
72
|
+
border-bottom-color: #8ecae6;
|
|
73
|
+
font-weight: 600;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* main container */
|
|
77
|
+
.container {
|
|
78
|
+
max-width: 1100px;
|
|
79
|
+
margin: 2rem auto 3rem;
|
|
80
|
+
padding: 0 2rem;
|
|
81
|
+
flex: 1;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
h1 {
|
|
85
|
+
font-size: 2.6rem;
|
|
86
|
+
font-weight: 600;
|
|
87
|
+
letter-spacing: -0.02em;
|
|
88
|
+
color: #0b1e2e;
|
|
89
|
+
margin-bottom: 0.25rem;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.subhead {
|
|
93
|
+
font-size: 1.2rem;
|
|
94
|
+
color: #2c3e50;
|
|
95
|
+
margin-bottom: 2.5rem;
|
|
96
|
+
border-left: 5px solid #2d7a9b;
|
|
97
|
+
padding-left: 1.2rem;
|
|
98
|
+
font-weight: 350;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
h2 {
|
|
102
|
+
font-size: 1.7rem;
|
|
103
|
+
font-weight: 600;
|
|
104
|
+
margin: 1.8rem 0 1rem;
|
|
105
|
+
color: #0f2b3d;
|
|
106
|
+
letter-spacing: -0.01em;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
h3 {
|
|
110
|
+
font-size: 1.25rem;
|
|
111
|
+
font-weight: 600;
|
|
112
|
+
margin: 1.5rem 0 0.5rem;
|
|
113
|
+
color: #1e4b63;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
p {
|
|
117
|
+
margin-bottom: 1.2rem;
|
|
118
|
+
color: #1e2f3f;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* cards on main page */
|
|
122
|
+
.card-grid {
|
|
123
|
+
display: grid;
|
|
124
|
+
grid-template-columns: 1fr 1fr;
|
|
125
|
+
gap: 2rem;
|
|
126
|
+
margin: 2rem 0 1.5rem;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.card {
|
|
130
|
+
background: #ffffff;
|
|
131
|
+
padding: 1.8rem 1.8rem 1.2rem;
|
|
132
|
+
border-radius: 18px;
|
|
133
|
+
box-shadow: 0 6px 18px rgba(0, 20, 30, 0.06);
|
|
134
|
+
border: 1px solid #e1eef5;
|
|
135
|
+
transition: transform 0.1s ease, box-shadow 0.15s;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.card:hover {
|
|
139
|
+
box-shadow: 0 12px 24px rgba(15, 43, 61, 0.08);
|
|
140
|
+
transform: translateY(-2px);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.card h2 {
|
|
144
|
+
margin-top: 0;
|
|
145
|
+
font-size: 1.5rem;
|
|
146
|
+
border-bottom: 2px solid #e1eef5;
|
|
147
|
+
padding-bottom: 0.5rem;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* lorem block */
|
|
151
|
+
.lorem-block {
|
|
152
|
+
background: #eef6fb;
|
|
153
|
+
padding: 2rem 2rem 1.2rem;
|
|
154
|
+
border-radius: 18px;
|
|
155
|
+
margin: 2rem 0;
|
|
156
|
+
border-left: 6px solid #2d7a9b;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.lorem-block h2 {
|
|
160
|
+
margin-top: 0;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* about page */
|
|
164
|
+
.about-section {
|
|
165
|
+
background: #ffffff;
|
|
166
|
+
padding: 1.8rem 2rem 1rem;
|
|
167
|
+
border-radius: 18px;
|
|
168
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.02);
|
|
169
|
+
border: 1px solid #e1eef5;
|
|
170
|
+
margin-bottom: 2rem;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.about-section h2 {
|
|
174
|
+
margin-top: 0;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* installation + usage */
|
|
178
|
+
.install-card {
|
|
179
|
+
background: #0f2b3d;
|
|
180
|
+
color: #e2e8f0;
|
|
181
|
+
padding: 2rem 2rem 1.2rem;
|
|
182
|
+
border-radius: 18px;
|
|
183
|
+
margin: 1.8rem 0 2rem;
|
|
184
|
+
box-shadow: 0 12px 20px -10px rgba(0, 0, 0, 0.2);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.install-card h2 {
|
|
188
|
+
color: #ffffff;
|
|
189
|
+
margin-top: 0;
|
|
190
|
+
border-bottom: 2px solid #2d7a9b;
|
|
191
|
+
padding-bottom: 0.5rem;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.install-card p {
|
|
195
|
+
color: #cbd5e1;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
pre {
|
|
199
|
+
background: #0b1e2e;
|
|
200
|
+
color: #b4e6ff;
|
|
201
|
+
padding: 1rem 1.5rem;
|
|
202
|
+
border-radius: 12px;
|
|
203
|
+
overflow-x: auto;
|
|
204
|
+
font-size: 0.95rem;
|
|
205
|
+
font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace;
|
|
206
|
+
border: 1px solid #1e4b63;
|
|
207
|
+
margin: 1rem 0 1.2rem;
|
|
208
|
+
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.02);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
code {
|
|
212
|
+
font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace;
|
|
213
|
+
background: #e1eef5;
|
|
214
|
+
padding: 0.2rem 0.4rem;
|
|
215
|
+
border-radius: 6px;
|
|
216
|
+
font-size: 0.9em;
|
|
217
|
+
color: #0f2b3d;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
pre code {
|
|
221
|
+
background: transparent;
|
|
222
|
+
padding: 0;
|
|
223
|
+
color: inherit;
|
|
224
|
+
font-size: 0.95rem;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.usage-section {
|
|
228
|
+
background: #ffffff;
|
|
229
|
+
padding: 1rem 2rem 1.8rem;
|
|
230
|
+
border-radius: 18px;
|
|
231
|
+
border: 1px solid #e1eef5;
|
|
232
|
+
margin-bottom: 2rem;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.usage-section h2 {
|
|
236
|
+
margin-top: 1.8rem;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.usage-section h2:first-of-type {
|
|
240
|
+
margin-top: 0.5rem;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.lorem-note {
|
|
244
|
+
background: #f1f9ff;
|
|
245
|
+
padding: 1.8rem 2rem 1rem;
|
|
246
|
+
border-radius: 18px;
|
|
247
|
+
border: 1px dashed #b4d9ec;
|
|
248
|
+
margin: 2rem 0 0;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* footer */
|
|
252
|
+
footer {
|
|
253
|
+
text-align: center;
|
|
254
|
+
padding: 1.8rem 2rem;
|
|
255
|
+
font-size: 0.9rem;
|
|
256
|
+
color: #5c7a8c;
|
|
257
|
+
border-top: 1px solid #d9e6ef;
|
|
258
|
+
background: #ffffff;
|
|
259
|
+
margin-top: 1rem;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/* responsive */
|
|
263
|
+
@media (max-width: 700px) {
|
|
264
|
+
.header-inner {
|
|
265
|
+
flex-direction: column;
|
|
266
|
+
gap: 0.8rem;
|
|
267
|
+
align-items: flex-start;
|
|
268
|
+
padding: 1rem 1.5rem;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
nav {
|
|
272
|
+
gap: 1.2rem;
|
|
273
|
+
width: 100%;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.container {
|
|
277
|
+
padding: 0 1.5rem;
|
|
278
|
+
margin-top: 1.5rem;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
h1 {
|
|
282
|
+
font-size: 2rem;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.subhead {
|
|
286
|
+
font-size: 1rem;
|
|
287
|
+
padding-left: 0.8rem;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.card-grid {
|
|
291
|
+
grid-template-columns: 1fr;
|
|
292
|
+
gap: 1.2rem;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.install-card,
|
|
296
|
+
.about-section,
|
|
297
|
+
.usage-section,
|
|
298
|
+
.lorem-block {
|
|
299
|
+
padding: 1.5rem 1.2rem 0.8rem;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
pre {
|
|
303
|
+
padding: 0.8rem 1rem;
|
|
304
|
+
font-size: 0.85rem;
|
|
305
|
+
}
|
|
306
|
+
}
|
tmscli-0.3.1/update.sh
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Exit immediately if any command fails
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
echo "Building the package with Hatch..."
|
|
7
|
+
hatch build
|
|
8
|
+
|
|
9
|
+
echo "Publishing the package to PyPI..."
|
|
10
|
+
hatch publish
|
|
11
|
+
|
|
12
|
+
echo "Pulling latest changes from remote Git repository..."
|
|
13
|
+
# Use || true so the script continues even if there is no tracking upstream configured yet
|
|
14
|
+
git pull || echo "Pull skipped or failed, continuing..."
|
|
15
|
+
|
|
16
|
+
echo "Staging changes..."
|
|
17
|
+
git add .
|
|
18
|
+
|
|
19
|
+
echo "Committing changes..."
|
|
20
|
+
git commit -m "New version"
|
|
21
|
+
|
|
22
|
+
echo "Pushing changes to remote..."
|
|
23
|
+
git push
|
|
24
|
+
|
|
25
|
+
echo "All steps completed successfully!"
|
tmscli-0.2.9/README.md
DELETED
tmscli-0.2.9/update.sh
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# 1. Start all three processes in the background simultaneously
|
|
4
|
-
echo "Starting tasks in parallel..."
|
|
5
|
-
|
|
6
|
-
hatch build &
|
|
7
|
-
PID_BUILD=$!
|
|
8
|
-
|
|
9
|
-
hatch publish &
|
|
10
|
-
PID_PASS=$!
|
|
11
|
-
|
|
12
|
-
# Replace 'pip install --upgrade ...' with your actual upgrade command if different
|
|
13
|
-
pip install --upgrade tmscli&
|
|
14
|
-
PID_PUBLISH=$!
|
|
15
|
-
|
|
16
|
-
# 2. Wait for all background processes to complete
|
|
17
|
-
wait $PID_BUILD $PID_PUBLISH $PID_UPGRADE
|
|
18
|
-
|
|
19
|
-
echo "All tasks finished!"
|
|
File without changes
|