@allixsenos/asu 0.7.0 → 0.9.0

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.
package/README.md CHANGED
@@ -2,74 +2,66 @@
2
2
 
3
3
  See how much of your coding-agent subscription you used, straight from the provider's account API.
4
4
 
5
- ASU is a local TypeScript CLI for humans and agents. It finds supported installations and credentials, fetches usage from each provider concurrently, and prints a table, plain text, or versioned JSON. Each provider has its own adapter. A failed provider does not hide the results of the other providers.
5
+ ASU is a local TypeScript CLI for humans and agents. It finds supported installations and credentials, fetches usage from each provider concurrently, and prints bars, a table, plain text, or versioned JSON. Each provider has its own adapter. A failed provider does not hide the results of the other providers.
6
6
 
7
7
  ## What it looks like
8
8
 
9
9
  ```bash
10
- npx --yes @allixsenos/asu --table
10
+ npx --yes @allixsenos/asu@latest
11
11
  ```
12
12
 
13
13
  ```text
14
- ASU 0.6.0 · 2026-09-08T13:41:25.567Z
15
- ┌──────────────────┬────────────────────┬───────────────────────┬───────────────────────┬────────────────────┐
16
- Provider │ Plan / status │ Window / balance │ Usage │ Resets in │
17
- ├──────────────────┼────────────────────┼───────────────────────┼───────────────────────┼────────────────────┤
18
- Claude │ Max 20x │ 5 hours │ 45% used │ 49m │
19
- │ │ active │ │ │ │
20
- │ │ fresh │ │ │ │
21
- │ │ │ Weekly │ 12% used │ 6d15h (Tue 15 Sep) │
22
- │ │ │ Weekly · Fable │ 11% used │ 6d15h (Tue 15 Sep) │
23
- │ │ │ Extra usage │ Disabled │ — │
24
- ├──────────────────┼────────────────────┼───────────────────────┼───────────────────────┼────────────────────┤
25
- Codex │ Plus │ 5 hours │ 0% used │ 5h │
26
- │ │ active │ │ │ │
27
- │ │ fresh │ │ │ │
28
- │ │ │ Weekly │ 0% used │ 7d (Tue 15 Sep) │
29
- │ │ │ Gpt Reserve · Weekly │ 0% used │ 7d (Tue 15 Sep) │
30
- │ │ │ Credits │ 0 credits left │ — │
31
- │ │ │ Credits available │ No │ — │
32
- ├──────────────────┼────────────────────┼───────────────────────┼───────────────────────┼────────────────────┤
33
- │ GitHub Copilot │ Individual │ Chat │ 0% used │ 22d10h (Thu 1 Oct)
34
- │ │ active │ │ 0 / 200 requests │ │
35
- │ │ fresh │ │ │ │
36
- │ │ │ Completions │ 0% used │ 22d10h (Thu 1 Oct) │
37
- │ │ │ │ 0 / 2,000 requests │ │
38
- │ │ │ Premium Interactions │ 100% used │ 22d10h (Thu 1 Oct) │
39
- │ │ │ │ 0 / 0 requests │ │
40
- └──────────────────┴────────────────────┴───────────────────────┴───────────────────────┴────────────────────┘
41
- Claude: fetched <1m ago; cache expires in 5m.
42
- Codex: fetched <1m ago; cache expires in 5m.
43
- GitHub Copilot: fetched <1m ago; cache expires in 5m.
14
+ ASU 0.7.0 · 2026-09-10T07:08:14.046Z
15
+
16
+ Claude · Max 20x · active · fresh
17
+ 5 hours ━━━━━───────────────────────── 18% resets 2h 21m · 11:30
18
+ Weekly ━━━━━━━─────────────────────── 24% resets 4d 21h · Tue 15 Sep 07:00
19
+ Weekly · Fable ━━━━━───────────────────────── 18% resets 4d 21h · Tue 15 Sep 07:00
20
+ Extra usage Disabled
21
+ fetched <1m ago · cache expires in 5m
22
+
23
+ Codex · Plus · active · fresh
24
+ 5 hours ────────────────────────────── 0% resets 4h 59m · 14:08
25
+ Weekly ────────────────────────────── 0% resets 6d 23h · Thu 17 Sep 09:08
26
+ Gpt Reserve · Weekly ────────────────────────────── 0% resets 6d 23h · Thu 17 Sep 09:08
27
+ Credits 0 credits left
28
+ Credits available No
29
+ fetched <1m ago · cache expires in 5m
30
+
31
+ GitHub Copilot · Individual · active · fresh
32
+ Chat ────────────────────────────── 0% resets 20d 16h · Thu 1 Oct 02:00 0 / 200 requests
33
+ Completions ────────────────────────────── 0% resets 20d 16h · Thu 1 Oct 02:00 0 / 2,000 requests
34
+ Premium Interactions ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% resets 20d 16h · Thu 1 Oct 02:00 0 / 0 requests
35
+ fetched <1m ago · cache expires in 5m
44
36
  ```
45
37
 
46
- This is a real run against the maintainer's accounts on 2026-09-08. Reset times are relative to the moment of the run. Pass `--utc` for full timestamps, `--plain` for log-friendly text, or `--json` for agents and scripts.
38
+ This is a real run against the maintainer's accounts on 2026-09-10. In a terminal the bars are green below 70 percent, yellow from 70, and red from 90. Reset times are relative to the moment of the run, with the local clock after the dot. Pass `--table` for the table view, `--utc` for full timestamps, `--plain` for log-friendly text, or `--json` for agents and scripts.
47
39
 
48
40
  ## Quick start
49
41
 
50
42
  ASU needs **Node.js 22.13 or newer** and npm. Sign in through the provider's own CLI first.
51
43
 
52
44
  ```bash
53
- npx --yes @allixsenos/asu --table
45
+ npx --yes @allixsenos/asu@latest
54
46
  ```
55
47
 
56
48
  This runs the newest release of [`@allixsenos/asu`](https://www.npmjs.com/package/@allixsenos/asu) from npm. No token is needed. Your provider credentials, which are separate, let ASU read usage.
57
49
 
58
50
  ```bash
59
51
  # Plain text for terminals, logs, and pipes
60
- npx --yes @allixsenos/asu --plain
52
+ npx --yes @allixsenos/asu@latest --plain
61
53
 
62
54
  # Structured output for agents and scripts
63
- npx --yes @allixsenos/asu --json
55
+ npx --yes @allixsenos/asu@latest --json
64
56
 
65
57
  # One provider, by its bare name
66
- npx --yes @allixsenos/asu claude
58
+ npx --yes @allixsenos/asu@latest claude
67
59
 
68
60
  # Select accounts and bypass the five-minute usage cache
69
- npx --yes @allixsenos/asu claude codex copilot --fresh --table
61
+ npx --yes @allixsenos/asu@latest claude codex copilot --fresh --table
70
62
 
71
63
  # Include every built-in provider, even if no credentials are found
72
- npx --yes @allixsenos/asu --all --table
64
+ npx --yes @allixsenos/asu@latest --all --table
73
65
  ```
74
66
 
75
67
  To pin a version, name it, for example `@allixsenos/asu@0.3.0`. The `--fresh` flag refreshes provider usage. It does not select a newer package revision.
@@ -84,7 +76,7 @@ This needs Git. The repository commits the built `dist/` directory, so the insta
84
76
 
85
77
  ## Real account output
86
78
 
87
- We fetched the snapshot below on **2026-09-08 at 13:41 UTC** from the maintainer's authenticated Claude, Codex, and GitHub Copilot accounts on Linux. These are real provider-reported figures, not fixtures or estimates. They become stale as usage changes.
79
+ We fetched the snapshot below on **2026-09-10 at 07:08 UTC** from the maintainer's authenticated Claude, Codex, and GitHub Copilot accounts on Linux. These are real provider-reported figures, not fixtures or estimates. They become stale as usage changes.
88
80
 
89
81
  The capture used the local checkout:
90
82
 
@@ -92,31 +84,60 @@ The capture used the local checkout:
92
84
  node dist/cli.js --provider claude,codex,copilot --fresh --no-cache --json
93
85
  ```
94
86
 
95
- ASU's own renderers made the table and the plain text below from that same JSON snapshot with `--utc`, so all three examples show identical data. The examples include no credentials and no account identifiers. All reset times are UTC.
87
+ ASU's own renderers made the bars, the table, and the plain text below from that same JSON snapshot with `--utc`, so all four examples show identical data. The examples include no credentials and no account identifiers. All reset times are UTC.
96
88
 
97
89
  Without `--utc`, the table and the plain text show reset, fetch, and expiry times relative to now, for example `2h30m` or `45m`. A time a day or more away also names the local calendar day, for example `7d (Tue 15 Sep)`. A reset time that already passed shows as `now`. JSON always contains the full UTC timestamps.
98
90
 
91
+ ### Bars
92
+
93
+ Use `--bars` for this view. It is the default in an interactive terminal. One bar per window, colored by severity in a terminal, with the countdown and the local clock after each bar. The bar shrinks in a narrow terminal, then the clock goes, and below that the default falls back to plain text.
94
+
95
+ ```text
96
+ ASU 0.7.0 · 2026-09-10T07:08:14.046Z
97
+
98
+ Claude · Max 20x · active · fresh
99
+ 5 hours ━━━━━───────────────────────── 18% resets 2026-09-10T09:30:00.000Z
100
+ Weekly ━━━━━━━─────────────────────── 24% resets 2026-09-15T05:00:00.000Z
101
+ Weekly · Fable ━━━━━───────────────────────── 18% resets 2026-09-15T05:00:00.000Z
102
+ Extra usage Disabled
103
+ fetched 2026-09-10T07:08:13.944Z · cache expires 2026-09-10T07:13:13.944Z
104
+
105
+ Codex · Plus · active · fresh
106
+ 5 hours ────────────────────────────── 0% resets 2026-09-10T12:08:13.000Z
107
+ Weekly ────────────────────────────── 0% resets 2026-09-17T07:08:13.000Z
108
+ Gpt Reserve · Weekly ────────────────────────────── 0% resets 2026-09-17T07:08:13.000Z
109
+ Credits 0 credits left
110
+ Credits available No
111
+ fetched 2026-09-10T07:08:14.004Z · cache expires 2026-09-10T07:13:14.004Z
112
+
113
+ GitHub Copilot · Individual · active · fresh
114
+ Chat ────────────────────────────── 0% resets 2026-10-01T00:00:00.000Z 0 / 200 requests
115
+ Completions ────────────────────────────── 0% resets 2026-10-01T00:00:00.000Z 0 / 2,000 requests
116
+ Premium Interactions ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% resets 2026-10-01T00:00:00.000Z 0 / 0 requests
117
+ fetched 2026-09-10T07:08:14.045Z · cache expires 2026-09-10T07:13:14.045Z
118
+ ```
119
+
99
120
  ### Pretty table
100
121
 
101
- Use `--table` for this view. It is also the default in an interactive terminal that is wide enough. When a cell would wrap, the default falls back to plain text. Pass `--table` to force the table.
122
+ Use `--table` for this view. When a cell would wrap, the default falls back to plain text. Pass `--table` to force the table.
102
123
 
103
124
  ```text
104
- ASU 0.6.0 · 2026-09-08T13:41:25.567Z
125
+ ASU 0.7.0 · 2026-09-10T07:08:14.046Z
105
126
  ┌──────────────────┬────────────────────┬───────────────────────┬───────────────────────┬────────────────────┐
106
127
  │ Provider │ Plan / status │ Window / balance │ Usage │ Resets (UTC) │
107
128
  ├──────────────────┼────────────────────┼───────────────────────┼───────────────────────┼────────────────────┤
108
- │ Claude │ Max 20x │ 5 hours │ 45% used │ 2026-09-08 14:30 │
129
+ │ Claude │ Max 20x │ 5 hours │ 18% used │ 2026-09-10 09:30 │
109
130
  │ │ active │ │ │ │
110
131
  │ │ fresh │ │ │ │
111
- │ │ │ Weekly │ 12% used │ 2026-09-15 05:00 │
112
- │ │ │ Weekly · Fable │ 11% used │ 2026-09-15 05:00 │
132
+ │ │ │ Weekly │ 24% used │ 2026-09-15 05:00 │
133
+ │ │ │ Weekly · Fable │ 18% used │ 2026-09-15 05:00 │
113
134
  │ │ │ Extra usage │ Disabled │ — │
114
135
  ├──────────────────┼────────────────────┼───────────────────────┼───────────────────────┼────────────────────┤
115
- │ Codex │ Plus │ 5 hours │ 0% used │ 2026-09-08 18:41
136
+ │ Codex │ Plus │ 5 hours │ 0% used │ 2026-09-10 12:08
116
137
  │ │ active │ │ │ │
117
138
  │ │ fresh │ │ │ │
118
- │ │ │ Weekly │ 0% used │ 2026-09-15 13:41
119
- │ │ │ Gpt Reserve · Weekly │ 0% used │ 2026-09-15 13:41
139
+ │ │ │ Weekly │ 0% used │ 2026-09-17 07:08
140
+ │ │ │ Gpt Reserve · Weekly │ 0% used │ 2026-09-17 07:08
120
141
  │ │ │ Credits │ 0 credits left │ — │
121
142
  │ │ │ Credits available │ No │ — │
122
143
  ├──────────────────┼────────────────────┼───────────────────────┼───────────────────────┼────────────────────┤
@@ -128,9 +149,9 @@ ASU 0.6.0 · 2026-09-08T13:41:25.567Z
128
149
  │ │ │ Premium Interactions │ 100% used │ 2026-10-01 00:00 │
129
150
  │ │ │ │ 0 / 0 requests │ │
130
151
  └──────────────────┴────────────────────┴───────────────────────┴───────────────────────┴────────────────────┘
131
- Claude: fetched 2026-09-08T13:41:24.073Z; cache expires 2026-09-08T13:46:24.073Z.
132
- Codex: fetched 2026-09-08T13:41:25.567Z; cache expires 2026-09-08T13:46:25.567Z.
133
- GitHub Copilot: fetched 2026-09-08T13:41:24.314Z; cache expires 2026-09-08T13:46:24.314Z.
152
+ Claude: fetched 2026-09-10T07:08:13.944Z; cache expires 2026-09-10T07:13:13.944Z.
153
+ Codex: fetched 2026-09-10T07:08:14.004Z; cache expires 2026-09-10T07:13:14.004Z.
154
+ GitHub Copilot: fetched 2026-09-10T07:08:14.045Z; cache expires 2026-09-10T07:13:14.045Z.
134
155
  ```
135
156
 
136
157
  Read Copilot's premium row with care. The endpoint returned zero entitlement, zero remaining requests, and zero percent remaining. ASU therefore shows `100% used` next to `0 / 0 requests`. This does **not** show that anyone consumed a premium request. The internal endpoint can return legacy quota information. Treat its quantities as the provider's reported snapshot, not as a complete billing statement.
@@ -143,26 +164,26 @@ Use `--plain` for readable output in logs and pipes. It is the default when stdo
143
164
  <summary>Show the complete plain-text output</summary>
144
165
 
145
166
  ```text
146
- ASU 0.6.0 · 2026-09-08T13:41:25.567Z
167
+ ASU 0.7.0 · 2026-09-10T07:08:14.046Z
147
168
 
148
169
  Claude (claude)
149
170
  active
150
171
  Plan: Max 20x
151
- 5 hours: 45% used; resets 2026-09-08T14:30:00.000Z
152
- Weekly: 12% used; resets 2026-09-15T05:00:00.000Z
153
- Weekly · Fable: 11% used; resets 2026-09-15T05:00:00.000Z
172
+ 5 hours: 18% used; resets 2026-09-10T09:30:00.000Z
173
+ Weekly: 24% used; resets 2026-09-15T05:00:00.000Z
174
+ Weekly · Fable: 18% used; resets 2026-09-15T05:00:00.000Z
154
175
  Extra usage: Disabled
155
- Fetched 2026-09-08T13:41:24.073Z; fresh; expires 2026-09-08T13:46:24.073Z
176
+ Fetched 2026-09-10T07:08:13.944Z; fresh; expires 2026-09-10T07:13:13.944Z
156
177
 
157
178
  Codex (codex)
158
179
  active
159
180
  Plan: Plus
160
- 5 hours: 0% used; resets 2026-09-08T18:41:25.000Z
161
- Weekly: 0% used; resets 2026-09-15T13:41:25.000Z
162
- Gpt Reserve · Weekly: 0% used; resets 2026-09-15T13:41:25.000Z
181
+ 5 hours: 0% used; resets 2026-09-10T12:08:13.000Z
182
+ Weekly: 0% used; resets 2026-09-17T07:08:13.000Z
183
+ Gpt Reserve · Weekly: 0% used; resets 2026-09-17T07:08:13.000Z
163
184
  Credits: 0 credits left
164
185
  Credits available: No
165
- Fetched 2026-09-08T13:41:25.567Z; fresh; expires 2026-09-08T13:46:25.567Z
186
+ Fetched 2026-09-10T07:08:14.004Z; fresh; expires 2026-09-10T07:13:14.004Z
166
187
 
167
188
  GitHub Copilot (copilot)
168
189
  active
@@ -170,7 +191,7 @@ GitHub Copilot (copilot)
170
191
  Chat: 0% used; 0 / 200 requests; resets 2026-10-01T00:00:00.000Z
171
192
  Completions: 0% used; 0 / 2,000 requests; resets 2026-10-01T00:00:00.000Z
172
193
  Premium Interactions: 100% used; 0 / 0 requests; resets 2026-10-01T00:00:00.000Z
173
- Fetched 2026-09-08T13:41:24.314Z; fresh; expires 2026-09-08T13:46:24.314Z
194
+ Fetched 2026-09-10T07:08:14.045Z; fresh; expires 2026-09-10T07:13:14.045Z
174
195
  ```
175
196
 
176
197
  </details>
@@ -185,8 +206,8 @@ Use `--json` for agents and scripts. Stdout contains the report. An ASU invocati
185
206
  ```json
186
207
  {
187
208
  "schemaVersion": 1,
188
- "asuVersion": "0.6.0",
189
- "generatedAt": "2026-09-08T13:41:25.567Z",
209
+ "asuVersion": "0.7.0",
210
+ "generatedAt": "2026-09-10T07:08:14.046Z",
190
211
  "warnings": [],
191
212
  "providers": [
192
213
  {
@@ -195,19 +216,19 @@ Use `--json` for agents and scripts. Stdout contains the report. An ASU invocati
195
216
  {
196
217
  "id": "five_hour",
197
218
  "label": "5 hours",
198
- "percentUsed": 45,
199
- "resetsAt": "2026-09-08T14:30:00.000Z"
219
+ "percentUsed": 18,
220
+ "resetsAt": "2026-09-10T09:30:00.000Z"
200
221
  },
201
222
  {
202
223
  "id": "seven_day",
203
224
  "label": "Weekly",
204
- "percentUsed": 12,
225
+ "percentUsed": 24,
205
226
  "resetsAt": "2026-09-15T05:00:00.000Z"
206
227
  },
207
228
  {
208
229
  "id": "weekly-model-fable",
209
230
  "label": "Weekly · Fable",
210
- "percentUsed": 11,
231
+ "percentUsed": 18,
211
232
  "resetsAt": "2026-09-15T05:00:00.000Z",
212
233
  "scope": {
213
234
  "model": "Fable"
@@ -229,8 +250,8 @@ Use `--json` for agents and scripts. Stdout contains the report. An ASU invocati
229
250
  "authenticated": true,
230
251
  "availability": "available",
231
252
  "reason": null,
232
- "fetchedAt": "2026-09-08T13:41:24.073Z",
233
- "expiresAt": "2026-09-08T13:46:24.073Z",
253
+ "fetchedAt": "2026-09-10T07:08:13.944Z",
254
+ "expiresAt": "2026-09-10T07:13:13.944Z",
234
255
  "cached": false
235
256
  },
236
257
  {
@@ -240,19 +261,19 @@ Use `--json` for agents and scripts. Stdout contains the report. An ASU invocati
240
261
  "id": "usage-primary_window",
241
262
  "label": "5 hours",
242
263
  "percentUsed": 0,
243
- "resetsAt": "2026-09-08T18:41:25.000Z"
264
+ "resetsAt": "2026-09-10T12:08:13.000Z"
244
265
  },
245
266
  {
246
267
  "id": "usage-secondary_window",
247
268
  "label": "Weekly",
248
269
  "percentUsed": 0,
249
- "resetsAt": "2026-09-15T13:41:25.000Z"
270
+ "resetsAt": "2026-09-17T07:08:13.000Z"
250
271
  },
251
272
  {
252
273
  "id": "additional-0-gpt-reserve-primary_window",
253
274
  "label": "Gpt Reserve · Weekly",
254
275
  "percentUsed": 0,
255
- "resetsAt": "2026-09-15T13:41:25.000Z"
276
+ "resetsAt": "2026-09-17T07:08:13.000Z"
256
277
  }
257
278
  ],
258
279
  "balances": [
@@ -278,8 +299,8 @@ Use `--json` for agents and scripts. Stdout contains the report. An ASU invocati
278
299
  "authenticated": true,
279
300
  "availability": "available",
280
301
  "reason": null,
281
- "fetchedAt": "2026-09-08T13:41:25.567Z",
282
- "expiresAt": "2026-09-08T13:46:25.567Z",
302
+ "fetchedAt": "2026-09-10T07:08:14.004Z",
303
+ "expiresAt": "2026-09-10T07:13:14.004Z",
283
304
  "cached": false
284
305
  },
285
306
  {
@@ -326,8 +347,8 @@ Use `--json` for agents and scripts. Stdout contains the report. An ASU invocati
326
347
  "authenticated": true,
327
348
  "availability": "available",
328
349
  "reason": null,
329
- "fetchedAt": "2026-09-08T13:41:24.314Z",
330
- "expiresAt": "2026-09-08T13:46:24.314Z",
350
+ "fetchedAt": "2026-09-10T07:08:14.045Z",
351
+ "expiresAt": "2026-09-10T07:13:14.045Z",
331
352
  "cached": false
332
353
  }
333
354
  ]
@@ -346,8 +367,8 @@ When you run ASU through `npx`, put the ASU options after the package name.
346
367
 
347
368
  | Option | Behavior |
348
369
  | --- | --- |
349
- | `--format plain\|table\|json` | Select one output format. Without it, a terminal gets the table, or plain text when the table would wrap. A pipe gets plain text. |
350
- | `--plain`, `--table`, `--json` | Shortcuts for `--format`. Use only one. |
370
+ | `--format plain\|table\|bars\|json` | Select one output format. Without it, a terminal gets the bars, or plain text when even the narrowest bar layout would wrap. A pipe gets plain text. |
371
+ | `--bars`, `--table`, `--plain`, `--json` | Shortcuts for `--format`. Use only one. |
351
372
  | `--utc` | Print full UTC timestamps in table and plain output instead of times relative to now, such as `2h30m` or `7d (Tue 15 Sep)` |
352
373
  | `claude codex` | Select providers by their bare names, in any position. `asu claude --plain` and `asu --plain claude` are the same. |
353
374
  | `--provider claude,codex` | The same selection as a flag. Repeat the flag or separate the IDs with commas. |
@@ -374,7 +395,7 @@ A zero exit code does not mean that every provider succeeded. When you automate
374
395
  ### Use JSON in scripts
375
396
 
376
397
  ```bash
377
- npx --yes @allixsenos/asu --json > usage.json
398
+ npx --yes @allixsenos/asu@latest --json > usage.json
378
399
  jq '.providers[] | {providerId, availability, planLabel, windows}' usage.json
379
400
 
380
401
  # Find available providers with a window at or above 80% used
@@ -462,6 +483,8 @@ An HTTP request has an eight-second deadline, a one-MiB response limit, and no r
462
483
 
463
484
  ASU reads existing credentials and sends them only to the provider endpoint of the adapter. It never refreshes a token, signs in, rewrites a provider file, runs the provider CLI to get usage, or estimates subscription consumption from conversation history. Missing or rejected credentials give an unavailable result. Sign in or refresh through the provider's own CLI.
464
485
 
486
+ Once a day, after the report, ASU asks the npm registry for its own newest version and prints one line on stderr when a newer one exists. The request carries only the package name, and the answer is kept in the cache directory. `--no-cache`, `ASU_NO_UPDATE_CHECK=1`, `NO_UPDATE_NOTIFIER=1`, or `CI=true` turns the check off. This is the only request ASU makes to anything other than a provider.
487
+
465
488
  ASU prints and caches only normalized usage. It excludes tokens, refresh tokens, account IDs, and raw API errors. The cache uses private directory and file permissions on Unix, and SHA-256 filenames derived from the credential identity. A usage report still contains plan and account-usage information. The maintainer shared the examples above on purpose.
466
489
 
467
490
  ## Troubleshooting
@@ -478,13 +501,14 @@ ASU prints and caches only normalized usage. It excludes tokens, refresh tokens,
478
501
  | `invalid_response` | The provider may have a new response schema. See the [known limitations](docs/provider-contracts.md#known-limitations). |
479
502
  | Usage looks stale | Examine `fetchedAt` and `cached`, then use `--fresh`. ASU cannot make the provider update its figures sooner. |
480
503
  | One provider fails but the command exits with zero | Exit code `0` means that at least one provider succeeded. Examine the `availability` of each provider. |
504
+ | `npx --yes @allixsenos/asu` runs an old version | npx reuses the first version it cached for a bare name and never looks again. Use `@allixsenos/asu@latest`, which resolves on every run, or remove the cache with `rm -rf ~/.npm/_npx`. ASU prints a one-line notice on stderr once a day when a newer version exists. |
481
505
 
482
506
  ## Plugins
483
507
 
484
508
  A provider is an ESM module with a unique ID, a version, and three operations: detect the installation, resolve the credentials, and fetch normalized usage. An adapter owns its credential format and its API contract. The shared service and the renderers stay provider-independent.
485
509
 
486
510
  ```bash
487
- npx --yes @allixsenos/asu --plugin ./my-provider.mjs --provider my-provider --json
511
+ npx --yes @allixsenos/asu@latest --plugin ./my-provider.mjs --provider my-provider --json
488
512
  ```
489
513
 
490
514
  A plugin can export `default` or `provider`. ASU resolves an installed package name from the current working directory. A plugin is local code that you load explicitly, and it has full access to the process. Load only modules that you trust. ASU does not download plugins and does not search for them. See the [plugin contract and example](docs/architecture.md#external-plugin-example) for the details. The package also exports its service, schemas, and TypeScript types as a library.
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- export declare const help = "asu \u2014 agent subscription usage\n\nUsage: asu [usage] [provider...] [options]\n\n asu Every detected provider\n asu claude One provider, by its bare name\n asu claude codex --plain Several providers, with options anywhere\n\n --format plain|table|json Output format (table in a terminal, plain when piped or when the table would wrap)\n --json Shortcut for --format json\n --plain Shortcut for --format plain\n --table Shortcut for --format table\n --utc Print full UTC timestamps instead of times relative to now\n --provider <id> Select provider; same as a bare name, repeat or use comma-separated IDs\n --all Include providers with no detected install or credentials\n --fresh Fetch again, bypassing the five-minute cache\n --no-cache Do not read or write the persistent cache\n --cache-dir <path> Override the private usage cache directory\n --plugin <path-or-package> Load a trusted provider plugin; repeatable\n --help, -h Show this help\n --version, -v Show version\n\nProviders: claude, codex, copilot, cursor, zai, grok, kimi, minimax\nCredentials are read-only. Sign in and refresh tokens through the provider CLI.\nJSON has schemaVersion: 1. Diagnostics go to stderr; stdout contains only the report.\nExit codes: 0 at least one available provider; 1 none available; 2 invocation error.\n";
2
+ export declare const help = "asu \u2014 agent subscription usage\n\nUsage: asu [usage] [provider...] [options]\n\n asu Every detected provider\n asu claude One provider, by its bare name\n asu claude codex --plain Several providers, with options anywhere\n\n --format plain|table|bars|json\n Output format (bars in a terminal, plain when piped or when a line would wrap)\n --bars Shortcut for --format bars: one bar per window, colored in a terminal\n --table Shortcut for --format table\n --plain Shortcut for --format plain\n --json Shortcut for --format json\n --utc Print full UTC timestamps instead of times relative to now\n --provider <id> Select provider; same as a bare name, repeat or use comma-separated IDs\n --all Include providers with no detected install or credentials\n --fresh Fetch again, bypassing the five-minute cache\n --no-cache Do not read or write the persistent cache\n --cache-dir <path> Override the private usage cache directory\n --plugin <path-or-package> Load a trusted provider plugin; repeatable\n --help, -h Show this help\n --version, -v Show version\n\nProviders: claude, codex, copilot, cursor, zai, grok, kimi, minimax\nCredentials are read-only. Sign in and refresh tokens through the provider CLI.\nJSON has schemaVersion: 1. Diagnostics go to stderr; stdout contains only the report.\nExit codes: 0 at least one available provider; 1 none available; 2 invocation error.\n";
3
3
  export declare function run(args?: string[]): Promise<number>;
package/dist/cli.js CHANGED
@@ -7,8 +7,10 @@ import { UsageCache } from './cache.js';
7
7
  import { createLocalContext, homePath } from './local.js';
8
8
  import { loadProviders } from './registry.js';
9
9
  import { UsageService } from './service.js';
10
- import { render, tableWraps } from './output.js';
11
- import { version } from './version.js';
10
+ import { barsOverflow, render, tableWraps } from './output.js';
11
+ import { name, version } from './version.js';
12
+ import { checkForUpdate } from './update.js';
13
+ import { createTransport } from './transport.js';
12
14
  export const help = `asu — agent subscription usage
13
15
 
14
16
  Usage: asu [usage] [provider...] [options]
@@ -17,10 +19,12 @@ Usage: asu [usage] [provider...] [options]
17
19
  asu claude One provider, by its bare name
18
20
  asu claude codex --plain Several providers, with options anywhere
19
21
 
20
- --format plain|table|json Output format (table in a terminal, plain when piped or when the table would wrap)
21
- --json Shortcut for --format json
22
- --plain Shortcut for --format plain
22
+ --format plain|table|bars|json
23
+ Output format (bars in a terminal, plain when piped or when a line would wrap)
24
+ --bars Shortcut for --format bars: one bar per window, colored in a terminal
23
25
  --table Shortcut for --format table
26
+ --plain Shortcut for --format plain
27
+ --json Shortcut for --format json
24
28
  --utc Print full UTC timestamps instead of times relative to now
25
29
  --provider <id> Select provider; same as a bare name, repeat or use comma-separated IDs
26
30
  --all Include providers with no detected install or credentials
@@ -37,10 +41,10 @@ JSON has schemaVersion: 1. Diagnostics go to stderr; stdout contains only the re
37
41
  Exit codes: 0 at least one available provider; 1 none available; 2 invocation error.
38
42
  `;
39
43
  export async function run(args = process.argv.slice(2)) {
40
- let format = process.stdout.isTTY ? 'table' : 'plain';
44
+ let format = process.stdout.isTTY ? 'bars' : 'plain';
41
45
  try {
42
46
  const { values, positionals } = parseArgs({ args, allowPositionals: true, strict: true, options: {
43
- format: { type: 'string' }, json: { type: 'boolean' }, plain: { type: 'boolean' }, table: { type: 'boolean' }, utc: { type: 'boolean' },
47
+ format: { type: 'string' }, json: { type: 'boolean' }, plain: { type: 'boolean' }, table: { type: 'boolean' }, bars: { type: 'boolean' }, utc: { type: 'boolean' },
44
48
  provider: { type: 'string', multiple: true }, all: { type: 'boolean' }, fresh: { type: 'boolean' },
45
49
  'no-cache': { type: 'boolean' }, 'cache-dir': { type: 'string' }, plugin: { type: 'string', multiple: true },
46
50
  help: { type: 'boolean', short: 'h' }, version: { type: 'boolean', short: 'v' },
@@ -55,9 +59,9 @@ export async function run(args = process.argv.slice(2)) {
55
59
  }
56
60
  // Bare words are provider names. A leading "usage" stays accepted for compatibility.
57
61
  const names = positionals[0] === 'usage' ? positionals.slice(1) : positionals;
58
- const formats = [values.format, values.json ? 'json' : undefined, values.plain ? 'plain' : undefined, values.table ? 'table' : undefined].filter(Boolean);
59
- if (formats.length > 1 || formats.some(value => !['plain', 'table', 'json'].includes(value)))
60
- throw new Error('Choose one output format: plain, table, or json.');
62
+ const formats = [values.format, values.json ? 'json' : undefined, values.plain ? 'plain' : undefined, values.table ? 'table' : undefined, values.bars ? 'bars' : undefined].filter(Boolean);
63
+ if (formats.length > 1 || formats.some(value => !['plain', 'table', 'bars', 'json'].includes(value)))
64
+ throw new Error('Choose one output format: plain, table, bars, or json.');
61
65
  const explicit = formats.length > 0;
62
66
  format = formats[0] ?? format;
63
67
  const providers = await loadProviders(values.plugin);
@@ -72,16 +76,25 @@ export async function run(args = process.argv.slice(2)) {
72
76
  const report = await service.collect({ providerIds, fresh: values.fresh });
73
77
  if (!values.all && !providerIds?.length)
74
78
  report.providers = report.providers.filter(provider => provider.installed || provider.credentialsPresent || provider.reason?.code !== 'missing_credentials');
75
- const options = { columns: process.stdout.columns, utc: values.utc };
76
- // A table that must wrap in a narrow terminal is harder to read than plain text.
79
+ const options = { columns: process.stdout.columns, utc: values.utc, color: Boolean(process.stdout.isTTY && !process.env.NO_COLOR) };
80
+ // A view that must wrap in a narrow terminal is harder to read than plain text.
77
81
  if (format === 'table' && !explicit && tableWraps(report, options))
78
82
  format = 'plain';
83
+ if (format === 'bars' && !explicit && barsOverflow(report, options))
84
+ format = 'plain';
79
85
  process.stdout.write(render(report, format, options));
86
+ // Once a day, after the report, ask npm for a newer version. One line on stderr, never on stdout.
87
+ const env = local.env;
88
+ if (!values['no-cache'] && !env.ASU_NO_UPDATE_CHECK && !env.NO_UPDATE_NOTIFIER && !env.CI) {
89
+ const notice = await checkForUpdate({ directory, request: createTransport(fetch, 2_000, 65_536), name, version });
90
+ if (notice)
91
+ process.stderr.write(`${notice}\n`);
92
+ }
80
93
  return report.providers.some(provider => provider.availability === 'available') ? 0 : 1;
81
94
  }
82
95
  catch (error) {
83
96
  // All errors exposed here are ours; do not print plugin/import/runtime exception messages.
84
- const messages = ['Choose one output format: plain, table, or json.',
97
+ const messages = ['Choose one output format: plain, table, bars, or json.',
85
98
  'Unknown provider ID. See --help for built-ins.', 'Could not load a provider plugin. Check its path, exports, and unique provider ID.'];
86
99
  const message = error instanceof Error && messages.includes(error.message) ? error.message : 'Could not run ASU. Check arguments and plugin configuration; see --help.';
87
100
  process.stderr.write(`asu: ${message}\n`);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/output.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import type { UsageReport } from './models.js';
2
- export type OutputFormat = 'plain' | 'table' | 'json';
2
+ export type OutputFormat = 'plain' | 'table' | 'bars' | 'json';
3
3
  export interface RenderOptions {
4
4
  columns?: number;
5
+ /** Emit ANSI colors in the bars view. The CLI turns this on for a terminal without NO_COLOR. */
6
+ color?: boolean;
5
7
  /** Print full UTC timestamps instead of times relative to now. */
6
8
  utc?: boolean;
7
9
  now?: number;
@@ -10,4 +12,7 @@ export declare function renderPlain(report: UsageReport, options?: RenderOptions
10
12
  export declare function renderTable(report: UsageReport, options?: RenderOptions): string;
11
13
  /** True when a cell would wrap at this width. The CLI then prefers plain output unless the table was requested. */
12
14
  export declare function tableWraps(report: UsageReport, options?: RenderOptions): boolean;
15
+ export declare function renderBars(report: UsageReport, options?: RenderOptions): string;
16
+ /** True when even the narrowest bar layout exceeds the width. The CLI then prefers plain output unless bars were requested. */
17
+ export declare function barsOverflow(report: UsageReport, options?: RenderOptions): boolean;
13
18
  export declare function render(report: UsageReport, format: OutputFormat, options?: RenderOptions): string;
package/dist/output.js CHANGED
@@ -187,7 +187,117 @@ export function renderTable(report, options = {}) {
187
187
  export function tableWraps(report, options = {}) {
188
188
  return buildTable(report, options).wrapped;
189
189
  }
190
+ // Bars: one bar per window, after ccswap's dashboard card. `5 hours ━━━╸─── 12% resets 2h 17m · 11:30`
191
+ const BAR_WIDTH = 30;
192
+ const sgr = (options, code, text) => options.color && text ? `\u001b[${code}m${text}\u001b[0m` : text;
193
+ const severity = (pct) => pct >= 90 ? '31' : pct >= 70 ? '33' : '32';
194
+ /** ccswap's countdown style, with a space between units: "45s", "12m", "2h 13m", "3d 4h". */
195
+ function spaced(ms) {
196
+ const s = Math.max(0, Math.floor(ms / 1000));
197
+ if (s < 60)
198
+ return `${s}s`;
199
+ if (s < 3600)
200
+ return `${Math.floor(s / 60)}m`;
201
+ if (s < 86_400) {
202
+ const h = Math.floor(s / 3600), m = Math.floor(s % 3600 / 60);
203
+ return m ? `${h}h ${m}m` : `${h}h`;
204
+ }
205
+ const d = Math.floor(s / 86_400), h = Math.floor(s % 86_400 / 3600);
206
+ return h ? `${d}d ${h}h` : `${d}d`;
207
+ }
208
+ const clockParts = new Intl.DateTimeFormat('en-US', { hour: '2-digit', minute: '2-digit', hourCycle: 'h23' });
209
+ /** Local clock: "11:30" on the same day, otherwise "Tue 15 Sep 07:00". */
210
+ function clock(at, now) {
211
+ const part = (type) => clockParts.formatToParts(at).find(item => item.type === type)?.value ?? '';
212
+ const time = `${part('hour')}:${part('minute')}`;
213
+ return new Date(at).toDateString() === new Date(now).toDateString() ? time : `${dayLabel.format(at)} ${time}`;
214
+ }
215
+ function resetSuffix(iso, options, layout) {
216
+ if (iso === null)
217
+ return '';
218
+ if (options.utc)
219
+ return `resets ${iso}`;
220
+ const now = options.now ?? Date.now(), at = Date.parse(iso), diff = at - now;
221
+ if (diff <= 0)
222
+ return 'resets now';
223
+ return layout.clock ? `resets ${spaced(diff)} · ${clock(at, now)}` : `resets ${spaced(diff)}`;
224
+ }
225
+ function bar(pct, options, layout) {
226
+ const width = layout.barWidth;
227
+ if (pct === null)
228
+ return sgr(options, '2', '─'.repeat(width));
229
+ const cells = Math.min(Math.max(pct, 0), 100) / 100 * width;
230
+ const full = Math.floor(cells), half = cells - full >= 0.5 && full < width;
231
+ return sgr(options, severity(pct), '━'.repeat(full) + (half ? '╸' : '')) + sgr(options, '2', '─'.repeat(width - full - (half ? 1 : 0)));
232
+ }
233
+ function quantity(window) {
234
+ const unit = window.unit ? ` ${window.unit}` : '';
235
+ if (window.used !== undefined)
236
+ return `${amount(window.used)}${window.limit === undefined ? '' : ` / ${amount(window.limit)}`}${unit}`;
237
+ return window.limit === undefined ? '' : `limit ${amount(window.limit)}${unit}`;
238
+ }
239
+ function buildBarLines(report, options, layout) {
240
+ const lines = [`ASU ${report.asuVersion} · ${report.generatedAt}`];
241
+ for (const provider of report.providers) {
242
+ const freshness = provider.availability === 'available' ? (provider.cached ? 'cached' : 'fresh') : null;
243
+ lines.push('', sgr(options, '1', [provider.displayName + (provider.experimental ? ' [experimental]' : ''), provider.planLabel, status(provider), freshness]
244
+ .filter(Boolean).join(' · ')));
245
+ const labels = [...provider.windows, ...provider.balances, ...provider.details].map(item => item.label);
246
+ const labelWidth = Math.max(0, ...labels.map(textWidth));
247
+ const cell = (label) => sgr(options, '2', label + ' '.repeat(labelWidth - textWidth(label)));
248
+ for (const window of provider.windows) {
249
+ const parts = [` ${cell(window.label)} ${bar(window.unlimited ? null : window.percentUsed, options, layout)}`];
250
+ if (window.unlimited)
251
+ parts.push(sgr(options, '2', 'unlimited'));
252
+ else if (window.percentUsed === null)
253
+ parts.push(sgr(options, '2', 'usage unknown'));
254
+ else
255
+ parts.push(sgr(options, severity(window.percentUsed), `${amount(window.percentUsed).padStart(3)}%`));
256
+ for (const extra of [resetSuffix(window.resetsAt, options, layout), quantity(window)])
257
+ if (extra)
258
+ parts.push(sgr(options, '2', extra));
259
+ lines.push(parts.join(' '));
260
+ }
261
+ for (const balance of provider.balances)
262
+ lines.push(` ${cell(balance.label)} ${balanceValue(balance)}`);
263
+ for (const detail of provider.details)
264
+ lines.push(` ${cell(detail.label)} ${detailValue(detail.value, options)}`);
265
+ if (provider.reason)
266
+ lines.push(` ${provider.reason.code}: ${provider.reason.message}`);
267
+ lines.push(sgr(options, '2', ` fetched ${ago(provider.fetchedAt, options)} · cache expires ${ahead(provider.expiresAt, options)}`));
268
+ }
269
+ if (!report.providers.length)
270
+ lines.push('', 'No supported agents or credentials detected. Use --all to list every provider.');
271
+ for (const warning of report.warnings)
272
+ lines.push('', `Warning: ${warning}`);
273
+ return lines;
274
+ }
275
+ /** Fit the view to the width like ccswap does: shrink the bar to 12 cells first, then drop the clock. */
276
+ function buildBars(report, options) {
277
+ const columns = options.columns ?? 110;
278
+ const widest = (layout) => Math.max(0, ...buildBarLines(report, { ...options, color: false }, layout).map(textWidth));
279
+ let layout = { barWidth: BAR_WIDTH, clock: true };
280
+ const excess = widest(layout) - columns;
281
+ if (excess > 0)
282
+ layout = { barWidth: Math.max(12, BAR_WIDTH - excess), clock: true };
283
+ if (widest(layout) > columns)
284
+ layout = { barWidth: 12, clock: false };
285
+ return { lines: buildBarLines(report, options, layout), overflow: widest(layout) > columns };
286
+ }
287
+ export function renderBars(report, options = {}) {
288
+ return buildBars(report, options).lines.join('\n') + '\n';
289
+ }
290
+ /** True when even the narrowest bar layout exceeds the width. The CLI then prefers plain output unless bars were requested. */
291
+ export function barsOverflow(report, options = {}) {
292
+ return buildBars(report, options).overflow;
293
+ }
190
294
  export function render(report, format, options = {}) {
191
- return format === 'json' ? JSON.stringify(report, null, 2) + '\n' : format === 'table' ? renderTable(report, options) : renderPlain(report, options);
295
+ if (format === 'json')
296
+ return JSON.stringify(report, null, 2) + '\n';
297
+ if (format === 'table')
298
+ return renderTable(report, options);
299
+ if (format === 'bars')
300
+ return renderBars(report, options);
301
+ return renderPlain(report, options);
192
302
  }
193
303
  //# sourceMappingURL=output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { RequestJson } from './transport.js';
2
+ export declare const UPDATE_CHECK_INTERVAL_MS = 86400000;
3
+ export interface UpdateCheckOptions {
4
+ /** The private cache directory. The daily stamp lives next to the usage cache. */
5
+ directory: string;
6
+ request: RequestJson;
7
+ name: string;
8
+ version: string;
9
+ now?: () => number;
10
+ }
11
+ /**
12
+ * Ask the npm registry for the newest version at most once a day.
13
+ * Returns a one-line notice when a newer version exists, otherwise null. Never throws.
14
+ */
15
+ export declare function checkForUpdate(options: UpdateCheckOptions): Promise<string | null>;
package/dist/update.js ADDED
@@ -0,0 +1,51 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ export const UPDATE_CHECK_INTERVAL_MS = 86_400_000;
4
+ /** Compare two plain x.y.z versions by their numeric parts. A prerelease or anything unparsable compares as older. */
5
+ function newer(candidate, current) {
6
+ const parse = (value) => /^(\d+)\.(\d+)\.(\d+)$/.exec(value)?.slice(1, 4).map(Number);
7
+ const a = parse(candidate), b = parse(current);
8
+ if (!a || !b)
9
+ return false;
10
+ for (let i = 0; i < 3; i++)
11
+ if (a[i] !== b[i])
12
+ return a[i] > b[i];
13
+ return false;
14
+ }
15
+ async function readStamp(path) {
16
+ try {
17
+ const raw = JSON.parse(await readFile(path, 'utf8'));
18
+ if (raw && typeof raw === 'object' && typeof raw.checkedAt === 'string' && typeof raw.latest === 'string')
19
+ return raw;
20
+ }
21
+ catch { /* No stamp yet, or an unreadable one. Check again. */ }
22
+ return null;
23
+ }
24
+ /**
25
+ * Ask the npm registry for the newest version at most once a day.
26
+ * Returns a one-line notice when a newer version exists, otherwise null. Never throws.
27
+ */
28
+ export async function checkForUpdate(options) {
29
+ const now = options.now ?? Date.now;
30
+ const path = join(options.directory, 'update-check.json');
31
+ try {
32
+ let stamp = await readStamp(path);
33
+ if (!stamp || now() - Date.parse(stamp.checkedAt) >= UPDATE_CHECK_INTERVAL_MS || now() < Date.parse(stamp.checkedAt)) {
34
+ const document = await options.request(`https://registry.npmjs.org/${encodeURIComponent(options.name)}/latest`);
35
+ const latest = document && typeof document === 'object' && typeof document.version === 'string'
36
+ ? document.version : null;
37
+ if (!latest)
38
+ return null;
39
+ stamp = { checkedAt: new Date(now()).toISOString(), latest };
40
+ await mkdir(options.directory, { recursive: true, mode: 0o700 });
41
+ await writeFile(path, JSON.stringify(stamp), { mode: 0o600 });
42
+ }
43
+ return newer(stamp.latest, options.version)
44
+ ? `asu: ${stamp.latest} is available, you run ${options.version}. Update: npx --yes ${options.name}@latest`
45
+ : null;
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- /** The package version, read once from package.json so the CLI, User-Agent and package never disagree. */
1
+ export declare const name: string;
2
2
  export declare const version: string;
package/dist/version.js CHANGED
@@ -1,4 +1,6 @@
1
1
  import { createRequire } from 'node:module';
2
- /** The package version, read once from package.json so the CLI, User-Agent and package never disagree. */
3
- export const version = createRequire(import.meta.url)('../package.json').version;
2
+ /** The package name and version, read once from package.json so the CLI, User-Agent and package never disagree. */
3
+ const pkg = createRequire(import.meta.url)('../package.json');
4
+ export const name = pkg.name;
5
+ export const version = pkg.version;
4
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,0GAA0G;AAC1G,MAAM,CAAC,MAAM,OAAO,GAAY,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,mHAAmH;AACnH,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAsC,CAAC;AACnG,MAAM,CAAC,MAAM,IAAI,GAAW,GAAG,CAAC,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC"}
@@ -5,12 +5,12 @@ ASU reports how much of a coding-agent subscription you used, straight from the
5
5
  ## The call
6
6
 
7
7
  ```bash
8
- npx --yes @allixsenos/asu <provider> --json
8
+ npx --yes @allixsenos/asu@latest <provider> --json
9
9
  ```
10
10
 
11
11
  Provider names: `claude` for Claude Code, `codex` for Codex, `copilot` for GitHub Copilot, `cursor`, `zai`, `grok`, `kimi`, `minimax`. Without a name, ASU reports every provider it detects.
12
12
 
13
- Use `--json`. Stdout holds only the report. Diagnostics go to stderr. Exit code 0 means at least one selected provider returned usage. Exit code 1 means none did, and the report still explains why. Exit code 2 means the invocation was wrong.
13
+ Use `--json`. Stdout holds only the report. Diagnostics go to stderr, including a once-a-day notice when a newer ASU exists, which you can ignore. The `@latest` tag matters: `npx` freezes a bare package name at the first version it cached. Exit code 0 means at least one selected provider returned usage. Exit code 1 means none did, and the report still explains why. Exit code 2 means the invocation was wrong.
14
14
 
15
15
  ASU only reads credentials that the provider's own CLI already stored. It never signs in, refreshes a token, or writes to a provider file.
16
16
 
@@ -32,14 +32,14 @@ For each entry in `providers`:
32
32
  Highest usage across all windows of one provider:
33
33
 
34
34
  ```bash
35
- npx --yes @allixsenos/asu claude --json \
35
+ npx --yes @allixsenos/asu@latest claude --json \
36
36
  | jq '[.providers[0].windows[].percentUsed | select(. != null)] | max'
37
37
  ```
38
38
 
39
39
  Minutes until the most constrained window resets:
40
40
 
41
41
  ```bash
42
- npx --yes @allixsenos/asu claude --json \
42
+ npx --yes @allixsenos/asu@latest claude --json \
43
43
  | jq -r '.providers[0].windows | max_by(.percentUsed // 0) | .resetsAt' \
44
44
  | xargs -I{} node -e 'console.log(Math.round((Date.parse("{}") - Date.now()) / 60000))'
45
45
  ```
@@ -47,7 +47,7 @@ npx --yes @allixsenos/asu claude --json \
47
47
  Every available provider with a window at or above 80 percent:
48
48
 
49
49
  ```bash
50
- npx --yes @allixsenos/asu --json | jq '[.providers[]
50
+ npx --yes @allixsenos/asu@latest --json | jq '[.providers[]
51
51
  | select(.availability == "available")
52
52
  | select(any(.windows[]; .percentUsed != null and .percentUsed >= 80))
53
53
  | .providerId]'
@@ -63,7 +63,7 @@ npx --yes @allixsenos/asu --json | jq '[.providers[]
63
63
  ## Paste into your project's agent instructions
64
64
 
65
65
  ```markdown
66
- Before a long task, run `npx --yes @allixsenos/asu claude --json` and read the highest
66
+ Before a long task, run `npx --yes @allixsenos/asu@latest claude --json` and read the highest
67
67
  `percentUsed` in `providers[0].windows`. Continue below 70. Between 70 and 90 use smaller
68
68
  steps. At 90 or above, stop, and tell the user the figure and the `resetsAt` time.
69
69
  Do not run it more than once per five minutes.
@@ -11,7 +11,7 @@ Read-only credential lookup Five-minute memory/disk cache + process locks
11
11
  ↓ ↓
12
12
  Provider usage API → adapter normalization → schema validation + redaction
13
13
 
14
- Versioned report → plain text / table / JSON
14
+ Versioned report → plain text / table / bars / JSON
15
15
  ```
16
16
 
17
17
  The package exports a library API and the `asu` executable. It contains no frontend and no daemon. The provider ID and version identify an adapter. The credentials are part of the cache key, so two accounts never share a cached result by accident.
package/docs/releasing.md CHANGED
@@ -43,7 +43,7 @@ After that, every release publishes on its own.
43
43
  ## Install a released version
44
44
 
45
45
  ```bash
46
- npx --yes @allixsenos/asu --table
46
+ npx --yes @allixsenos/asu@latest --table
47
47
  ```
48
48
 
49
49
  No token is needed. The package is public on the npm registry.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allixsenos/asu",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "Agent subscription usage for humans and agents",
5
5
  "type": "module",
6
6
  "bin": {