@dmsdc-ai/aterm-darwin-arm64 0.1.43 → 0.1.45
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.
|
Binary file
|
|
Binary file
|
|
@@ -25,6 +25,15 @@ ensure_lessons_file() {
|
|
|
25
25
|
[ -f "$f" ] || echo '{"invariants":[],"failed":[]}' > "$f"
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
print_ecosystem_status() {
|
|
29
|
+
cat <<'STATUS'
|
|
30
|
+
brain: ✅ installed
|
|
31
|
+
telepty: ✅ installed
|
|
32
|
+
deliberation: ✅ installed
|
|
33
|
+
devkit: ✅ installed
|
|
34
|
+
STATUS
|
|
35
|
+
}
|
|
36
|
+
|
|
28
37
|
aterm_ipc() {
|
|
29
38
|
python3 -c '
|
|
30
39
|
import socket, sys, json
|
|
@@ -100,17 +109,119 @@ finally:
|
|
|
100
109
|
|
|
101
110
|
case "${1:-help}" in
|
|
102
111
|
list)
|
|
103
|
-
if [[ -z "$ATERM_IPC_SOCKET" ]]; then exec telepty list "${@:2}"; fi
|
|
104
112
|
if [[ "${2:-}" == "--json" ]]; then
|
|
105
|
-
|
|
113
|
+
# JSON mode: output merged JSON
|
|
114
|
+
python3 -c '
|
|
115
|
+
import json, sys, os, subprocess, os.path
|
|
116
|
+
|
|
117
|
+
sessions = []
|
|
118
|
+
|
|
119
|
+
# 1. aterm internal sessions
|
|
120
|
+
sock = os.environ.get("ATERM_IPC_SOCKET", "")
|
|
121
|
+
if sock:
|
|
122
|
+
import socket as S
|
|
123
|
+
try:
|
|
124
|
+
s = S.socket(S.AF_UNIX, S.SOCK_STREAM)
|
|
125
|
+
s.settimeout(5)
|
|
126
|
+
s.connect(sock)
|
|
127
|
+
s.sendall(json.dumps({"action": "ListWorkspaces"}).encode() + b"\n")
|
|
128
|
+
s.shutdown(S.SHUT_WR)
|
|
129
|
+
data = b""
|
|
130
|
+
while True:
|
|
131
|
+
chunk = s.recv(4096)
|
|
132
|
+
if not chunk: break
|
|
133
|
+
data += chunk
|
|
134
|
+
if b"\n" in data: break
|
|
135
|
+
s.close()
|
|
136
|
+
resp = json.loads(data.decode().strip().split("\n")[0])
|
|
137
|
+
for ws in resp.get("data", []):
|
|
138
|
+
ws["terminal"] = "aterm"
|
|
139
|
+
ws.setdefault("name", os.path.basename(ws.get("cwd", "")) or ws.get("id", "?"))
|
|
140
|
+
sessions.append(ws)
|
|
141
|
+
except: pass
|
|
142
|
+
|
|
143
|
+
# 2. telepty external sessions (only if installed)
|
|
144
|
+
try:
|
|
145
|
+
result = subprocess.run(["telepty", "list", "--json"], capture_output=True, text=True, timeout=5)
|
|
146
|
+
if result.returncode == 0:
|
|
147
|
+
tdata = json.loads(result.stdout)
|
|
148
|
+
for ts in (tdata if isinstance(tdata, list) else tdata.get("sessions", [])):
|
|
149
|
+
ts.setdefault("terminal", ts.get("terminal", "external"))
|
|
150
|
+
ts.setdefault("name", ts.get("id", "?"))
|
|
151
|
+
sessions.append(ts)
|
|
152
|
+
except (FileNotFoundError, subprocess.TimeoutExpired, json.JSONDecodeError): pass
|
|
153
|
+
|
|
154
|
+
print(json.dumps({"sessions": sessions}))
|
|
155
|
+
'
|
|
106
156
|
else
|
|
107
|
-
|
|
157
|
+
# Table mode: merged display
|
|
158
|
+
python3 -c '
|
|
159
|
+
import json, sys, os, subprocess, os.path
|
|
160
|
+
|
|
161
|
+
sessions = []
|
|
162
|
+
|
|
163
|
+
# 1. aterm internal sessions
|
|
164
|
+
sock = os.environ.get("ATERM_IPC_SOCKET", "")
|
|
165
|
+
if sock:
|
|
166
|
+
import socket as S
|
|
167
|
+
try:
|
|
168
|
+
s = S.socket(S.AF_UNIX, S.SOCK_STREAM)
|
|
169
|
+
s.settimeout(5)
|
|
170
|
+
s.connect(sock)
|
|
171
|
+
s.sendall(json.dumps({"action": "ListWorkspaces"}).encode() + b"\n")
|
|
172
|
+
s.shutdown(S.SHUT_WR)
|
|
173
|
+
data = b""
|
|
174
|
+
while True:
|
|
175
|
+
chunk = s.recv(4096)
|
|
176
|
+
if not chunk: break
|
|
177
|
+
data += chunk
|
|
178
|
+
if b"\n" in data: break
|
|
179
|
+
s.close()
|
|
180
|
+
resp = json.loads(data.decode().strip().split("\n")[0])
|
|
181
|
+
for ws in resp.get("data", []):
|
|
182
|
+
name = ws.get("name") or os.path.basename(ws.get("cwd", "")) or ws.get("id", "?")
|
|
183
|
+
cli = ws.get("cli", "")
|
|
184
|
+
cwd = ws.get("cwd", "")
|
|
185
|
+
sessions.append((name, cli, cwd, "aterm"))
|
|
186
|
+
except: pass
|
|
187
|
+
|
|
188
|
+
# 2. telepty external sessions (only if installed)
|
|
189
|
+
try:
|
|
190
|
+
result = subprocess.run(["telepty", "list", "--json"], capture_output=True, text=True, timeout=5)
|
|
191
|
+
if result.returncode == 0:
|
|
192
|
+
tdata = json.loads(result.stdout)
|
|
193
|
+
for ts in (tdata if isinstance(tdata, list) else tdata.get("sessions", [])):
|
|
194
|
+
name = ts.get("name") or ts.get("id", "?")
|
|
195
|
+
cli = ts.get("cli", "")
|
|
196
|
+
cwd = ts.get("cwd", "")
|
|
197
|
+
terminal = ts.get("terminal", "external")
|
|
198
|
+
sessions.append((name, cli, cwd, terminal))
|
|
199
|
+
except (FileNotFoundError, subprocess.TimeoutExpired, json.JSONDecodeError): pass
|
|
200
|
+
|
|
201
|
+
if not sessions:
|
|
202
|
+
print("(no reachable sessions)")
|
|
203
|
+
else:
|
|
204
|
+
cols = ["NAME", "CLI", "CWD", "TERMINAL"]
|
|
205
|
+
widths = [max(len(c), *(len(r[i]) for r in sessions)) for i, c in enumerate(cols)]
|
|
206
|
+
fmt = " ".join(f"{{:<{w}}}" for w in widths)
|
|
207
|
+
print(fmt.format(*cols))
|
|
208
|
+
print(" ".join("\u2500" * w for w in widths))
|
|
209
|
+
for r in sessions:
|
|
210
|
+
print(fmt.format(*r))
|
|
211
|
+
if all(r[3] == "aterm" for r in sessions):
|
|
212
|
+
print()
|
|
213
|
+
print("💡 All sessions are aterm-internal. Install telepty for cross-terminal: already included!")
|
|
214
|
+
'
|
|
108
215
|
fi ;;
|
|
109
216
|
inject)
|
|
110
217
|
if [[ -z "$ATERM_IPC_SOCKET" ]]; then exec telepty inject "${@:2}"; fi
|
|
111
218
|
[[ $# -lt 3 ]] && { echo '{"error":"usage: aterm inject <workspace> <text>"}' >&2; exit 1; }
|
|
112
219
|
aterm_ipc inject "${@:2}" ;;
|
|
113
220
|
status)
|
|
221
|
+
if [[ $# -eq 1 ]]; then
|
|
222
|
+
print_ecosystem_status
|
|
223
|
+
exit 0
|
|
224
|
+
fi
|
|
114
225
|
if [[ -z "$ATERM_IPC_SOCKET" ]]; then exec telepty status "${@:2}"; fi
|
|
115
226
|
[[ $# -lt 2 ]] && { echo '{"error":"usage: aterm status <workspace>"}' >&2; exit 1; }
|
|
116
227
|
aterm_ipc status "$2" ;;
|
|
@@ -210,6 +321,7 @@ print(json.dumps({"status":"ok","type": ltype}))
|
|
|
210
321
|
|---------|-------------|
|
|
211
322
|
| `aterm list` | List workspaces (NAME, CLI, CWD, TERMINAL) |
|
|
212
323
|
| `aterm inject <workspace> <text>` | Send text to a workspace |
|
|
324
|
+
| `aterm status` | Show bundled ecosystem health |
|
|
213
325
|
| `aterm status <workspace>` | Check workspace status |
|
|
214
326
|
| `aterm focus <workspace>` | Focus a workspace tab |
|
|
215
327
|
| `aterm tasks` | List pending tasks |
|
|
@@ -220,6 +332,13 @@ print(json.dumps({"status":"ok","type": ltype}))
|
|
|
220
332
|
| `aterm lessons add '<lesson>' --type failed` | Add a failed pattern |
|
|
221
333
|
| `aterm help` | Show this help |
|
|
222
334
|
|
|
335
|
+
## Ecosystem
|
|
336
|
+
|
|
337
|
+
✅ brain (AI profile management) — already installed
|
|
338
|
+
✅ telepty (cross-terminal communication) — already installed
|
|
339
|
+
✅ deliberation (multi-AI discussions) — already installed
|
|
340
|
+
✅ devkit (workspace bootstrapping) — already installed
|
|
341
|
+
|
|
223
342
|
## Natural Language → Command Mapping
|
|
224
343
|
|
|
225
344
|
### Internal sessions (same aterm, $ATERM_IPC_SOCKET set)
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<dict>
|
|
7
7
|
<key>Resources/bin/aterm</key>
|
|
8
8
|
<data>
|
|
9
|
-
|
|
9
|
+
1HuLkmDie3Huck1M3zk1y2k9nHk=
|
|
10
10
|
</data>
|
|
11
11
|
</dict>
|
|
12
12
|
<key>files2</key>
|
|
@@ -15,16 +15,16 @@
|
|
|
15
15
|
<dict>
|
|
16
16
|
<key>cdhash</key>
|
|
17
17
|
<data>
|
|
18
|
-
|
|
18
|
+
9WsGAC35qT+7mJPrbcRgCAnPUmU=
|
|
19
19
|
</data>
|
|
20
20
|
<key>requirement</key>
|
|
21
|
-
<string>cdhash H"
|
|
21
|
+
<string>cdhash H"f56b06002df9a93fbb9893eb6dc4600809cf5265"</string>
|
|
22
22
|
</dict>
|
|
23
23
|
<key>Resources/bin/aterm</key>
|
|
24
24
|
<dict>
|
|
25
25
|
<key>hash2</key>
|
|
26
26
|
<data>
|
|
27
|
-
|
|
27
|
+
2w1QxQ4iZe+lQkanS659+19iwyQvKcZGja/KKimSqcw=
|
|
28
28
|
</data>
|
|
29
29
|
</dict>
|
|
30
30
|
</dict>
|