@subvalue/cli 0.1.2 → 0.1.4

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.
Files changed (40) hide show
  1. package/PRE_RELEASE.md +6 -6
  2. package/README.md +7 -5
  3. package/dist/PRICING.md +15 -16
  4. package/dist/packages/cli/src/index.js +109 -20
  5. package/dist/packages/cli/src/protocol.js +13 -0
  6. package/dist/packages/cli/src/runtime.js +44 -14
  7. package/dist/packages/cli/src/server.js +306 -62
  8. package/dist/packages/core/src/calendar.js +47 -0
  9. package/dist/packages/core/src/coverage.js +12 -0
  10. package/dist/packages/core/src/demo.js +61 -9
  11. package/dist/packages/core/src/metadata.js +52 -9
  12. package/dist/packages/core/src/pricing/current.js +346 -297
  13. package/dist/packages/core/src/pricing/index.js +373 -73
  14. package/dist/packages/core/src/providers/claude/index.js +93 -21
  15. package/dist/packages/core/src/providers/codex/index.js +213 -46
  16. package/dist/packages/core/src/scanner.js +226 -46
  17. package/dist/packages/core/src/security.js +127 -34
  18. package/dist/packages/core/src/storage.js +215 -47
  19. package/dist/packages/core/src/subscriptions.js +146 -21
  20. package/dist/packages/core/src/summary.js +409 -51
  21. package/dist/packages/core/src/types.js +71 -17
  22. package/dist/packages/core/src/usage-json.js +166 -47
  23. package/dist/packages/receipt/src/index.js +387 -80
  24. package/dist/packages/ui/src/brand.js +48 -3
  25. package/dist/public/app.css +2280 -56
  26. package/dist/public/apps/web/src/landing.js +200 -8
  27. package/dist/public/apps/web/src/main.js +1143 -63
  28. package/dist/public/index.html +24 -1
  29. package/dist/public/landing.css +3235 -70
  30. package/dist/public/landing.html +21 -1
  31. package/dist/public/logo/wordmark-monochrome.svg +1 -0
  32. package/dist/public/logo/wordmark.svg +1 -0
  33. package/dist/public/packages/core/src/calendar.js +47 -0
  34. package/dist/public/packages/core/src/coverage.js +12 -0
  35. package/dist/public/packages/core/src/subscriptions.js +146 -21
  36. package/dist/public/packages/receipt/src/index.js +387 -80
  37. package/dist/public/packages/ui/src/brand.js +48 -3
  38. package/dist/public/privacy.css +197 -6
  39. package/dist/public/privacy.html +1 -1
  40. package/package.json +1 -1
@@ -1,8 +1,199 @@
1
1
  /* Both the public page and local app use the same receipt renderer and tokens. */
2
- @font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:block;src:url('/fonts/inter-latin.woff2') format('woff2')}
3
- @font-face{font-family:'Plex Mono';font-style:normal;font-weight:400 700;font-display:block;src:url('/fonts/plex-mono.woff2') format('woff2')}
4
- .brand-name{color:#eff0f1;font-weight:inherit;letter-spacing:inherit}.brand-name-accent{color:#37ec85}
2
+ @font-face {
3
+ font-family: Inter;
4
+ font-style: normal;
5
+ font-weight: 100 900;
6
+ font-display: block;
7
+ src: url('/fonts/inter-latin.woff2') format('woff2');
8
+ }
9
+ @font-face {
10
+ font-family: 'Plex Mono';
11
+ font-style: normal;
12
+ font-weight: 400 700;
13
+ font-display: block;
14
+ src: url('/fonts/plex-mono.woff2') format('woff2');
15
+ }
16
+ .brand-name {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ position: relative;
20
+ color: #eef2f4;
21
+ font-family: Inter, sans-serif;
22
+ font-weight: 800;
23
+ letter-spacing: -0.055em;
24
+ }
25
+ .brand-name-accent {
26
+ color: #37ec85;
27
+ }
28
+ .brand-name-label {
29
+ position: absolute;
30
+ width: 1px;
31
+ height: 1px;
32
+ padding: 0;
33
+ margin: -1px;
34
+ overflow: hidden;
35
+ clip-path: inset(50%);
36
+ white-space: nowrap;
37
+ }
38
+ .brand-wordmark {
39
+ display: block;
40
+ width: 92px;
41
+ height: 14px;
42
+ overflow: visible;
43
+ }
44
+ @media (forced-colors: active) {
45
+ .brand-name,
46
+ .brand-name-accent {
47
+ color: CanvasText;
48
+ }
49
+ }
5
50
 
6
- :root{color-scheme:dark;--bg:#080b0d;--text:#eff0f1;--muted:#b2b7bd;--border:#25282d;--green:#37ec85}
7
- *{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:15px Inter,"Segoe UI",Arial,sans-serif;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}a:focus-visible{outline:2px solid var(--green);outline-offset:5px}a:hover{color:var(--green)}.privacy-nav{max-width:880px;margin:auto;padding:28px 32px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border)}.brand{display:flex;align-items:center;gap:11px;font-size:19px;font-weight:650;letter-spacing:-.5px}.privacy-back{color:var(--muted);font-size:13px;min-height:44px;display:flex;align-items:center}.privacy-document{max-width:784px;margin:auto;padding:50px 32px 40px}.privacy-document h1{font-size:32px;font-weight:550;letter-spacing:-1px;line-height:1.2;margin:0 0 22px}.privacy-document h2{font-size:18px;font-weight:550;letter-spacing:-.3px;margin:40px 0 16px;padding-top:26px;border-top:1px solid var(--border)}.privacy-document p,.privacy-document ul{color:var(--muted);line-height:1.85;margin:0 0 18px}.privacy-document ul{padding-left:21px}.privacy-document li{padding-left:4px;margin-bottom:8px}.privacy-document code{font:12px "Plex Mono",Consolas,monospace;color:var(--text);background:#13171c;padding:2px 5px;border:1px solid #22282e;border-radius:3px;overflow-wrap:anywhere}.privacy-document p a{color:var(--text);text-decoration:underline;text-underline-offset:4px}.privacy-document footer{margin-top:38px;padding-top:22px;border-top:1px solid var(--border);font-size:12px;color:var(--muted)}.privacy-skip{position:fixed;top:-100px;left:20px;background:var(--green);color:#080b0d;padding:12px;z-index:2}.privacy-skip:focus{top:12px}
8
- @media(max-width:600px){.privacy-nav{padding:14px 22px}.privacy-document{padding:32px 22px}.privacy-document h1{font-size:27px;max-width:280px}.privacy-document h2{font-size:17px;margin-top:30px;padding-top:22px}body{font-size:14px}.privacy-document code{font-size:11px}}
51
+ :root {
52
+ color-scheme: dark;
53
+ --bg: #080b0d;
54
+ --text: #eff0f1;
55
+ --muted: #b2b7bd;
56
+ --border: #25282d;
57
+ --green: #37ec85;
58
+ }
59
+ * {
60
+ box-sizing: border-box;
61
+ }
62
+ body {
63
+ margin: 0;
64
+ background: var(--bg);
65
+ color: var(--text);
66
+ font:
67
+ 15px Inter,
68
+ 'Segoe UI',
69
+ Arial,
70
+ sans-serif;
71
+ -webkit-font-smoothing: antialiased;
72
+ }
73
+ a {
74
+ color: inherit;
75
+ text-decoration: none;
76
+ }
77
+ a:focus-visible {
78
+ outline: 2px solid var(--green);
79
+ outline-offset: 5px;
80
+ }
81
+ a:hover {
82
+ color: var(--green);
83
+ }
84
+ .privacy-nav {
85
+ max-width: 880px;
86
+ margin: auto;
87
+ padding: 28px 32px;
88
+ display: flex;
89
+ justify-content: space-between;
90
+ align-items: center;
91
+ border-bottom: 1px solid var(--border);
92
+ }
93
+ .brand {
94
+ display: flex;
95
+ align-items: center;
96
+ gap: 11px;
97
+ font-size: 19px;
98
+ font-weight: 650;
99
+ letter-spacing: -0.5px;
100
+ }
101
+ .privacy-back {
102
+ color: var(--muted);
103
+ font-size: 13px;
104
+ min-height: 44px;
105
+ display: flex;
106
+ align-items: center;
107
+ }
108
+ .privacy-document {
109
+ max-width: 784px;
110
+ margin: auto;
111
+ padding: 50px 32px 40px;
112
+ }
113
+ .privacy-document h1 {
114
+ font-size: 32px;
115
+ font-weight: 550;
116
+ letter-spacing: -1px;
117
+ line-height: 1.2;
118
+ margin: 0 0 22px;
119
+ }
120
+ .privacy-document h2 {
121
+ font-size: 18px;
122
+ font-weight: 550;
123
+ letter-spacing: -0.3px;
124
+ margin: 40px 0 16px;
125
+ padding-top: 26px;
126
+ border-top: 1px solid var(--border);
127
+ }
128
+ .privacy-document p,
129
+ .privacy-document ul {
130
+ color: var(--muted);
131
+ line-height: 1.85;
132
+ margin: 0 0 18px;
133
+ }
134
+ .privacy-document ul {
135
+ padding-left: 21px;
136
+ }
137
+ .privacy-document li {
138
+ padding-left: 4px;
139
+ margin-bottom: 8px;
140
+ }
141
+ .privacy-document code {
142
+ font:
143
+ 12px 'Plex Mono',
144
+ Consolas,
145
+ monospace;
146
+ color: var(--text);
147
+ background: #13171c;
148
+ padding: 2px 5px;
149
+ border: 1px solid #22282e;
150
+ border-radius: 3px;
151
+ overflow-wrap: anywhere;
152
+ }
153
+ .privacy-document p a {
154
+ color: var(--text);
155
+ text-decoration: underline;
156
+ text-underline-offset: 4px;
157
+ }
158
+ .privacy-document footer {
159
+ margin-top: 38px;
160
+ padding-top: 22px;
161
+ border-top: 1px solid var(--border);
162
+ font-size: 12px;
163
+ color: var(--muted);
164
+ }
165
+ .privacy-skip {
166
+ position: fixed;
167
+ top: -100px;
168
+ left: 20px;
169
+ background: var(--green);
170
+ color: #080b0d;
171
+ padding: 12px;
172
+ z-index: 2;
173
+ }
174
+ .privacy-skip:focus {
175
+ top: 12px;
176
+ }
177
+ @media (max-width: 600px) {
178
+ .privacy-nav {
179
+ padding: 14px 22px;
180
+ }
181
+ .privacy-document {
182
+ padding: 32px 22px;
183
+ }
184
+ .privacy-document h1 {
185
+ font-size: 27px;
186
+ max-width: 280px;
187
+ }
188
+ .privacy-document h2 {
189
+ font-size: 17px;
190
+ margin-top: 30px;
191
+ padding-top: 22px;
192
+ }
193
+ body {
194
+ font-size: 14px;
195
+ }
196
+ .privacy-document code {
197
+ font-size: 11px;
198
+ }
199
+ }
@@ -1,4 +1,4 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"><meta name="theme-color" content="#080b0d"><title>Privacy and data access — SubValue</title><link rel="icon" href="/icon.svg"><link rel="preload" href="/fonts/inter-latin.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="/fonts/plex-mono.woff2" as="font" type="font/woff2" crossorigin><link rel="stylesheet" href="/privacy.css"></head><body class="privacy-page"><a class="privacy-skip" href="#policy">Skip to content</a><header class="privacy-nav"><a class="brand" href="/"><img src="/logo/mark-green.svg" alt="" width="24" height="24">SubValue</a><a class="privacy-back" href="/">← Back</a></header><main id="policy" class="privacy-document" tabindex="-1"><article><h1>Privacy and data access</h1>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"><meta name="theme-color" content="#080b0d"><title>Privacy and data access — SubValue</title><link rel="icon" href="/icon.svg"><link rel="preload" href="/fonts/inter-latin.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="/fonts/plex-mono.woff2" as="font" type="font/woff2" crossorigin><link rel="stylesheet" href="/privacy.css"></head><body class="privacy-page"><a class="privacy-skip" href="#policy">Skip to content</a><header class="privacy-nav"><a class="brand" href="/"><img src="/logo/mark-green.svg" alt="" width="24" height="24"><span class="brand-name"><span class="brand-name-label">SubValue</span><svg xmlns="http://www.w3.org/2000/svg" class="brand-wordmark" viewBox="0 0 46 7" fill="currentColor" shape-rendering="crispEdges" aria-hidden="true"><g><rect x="1" y="0" width="1" height="1"/><rect x="2" y="0" width="1" height="1"/><rect x="3" y="0" width="1" height="1"/><rect x="4" y="0" width="1" height="1"/><rect x="0" y="1" width="1" height="1"/><rect x="0" y="2" width="1" height="1"/><rect x="1" y="3" width="1" height="1"/><rect x="2" y="3" width="1" height="1"/><rect x="3" y="3" width="1" height="1"/><rect x="4" y="4" width="1" height="1"/><rect x="4" y="5" width="1" height="1"/><rect x="0" y="6" width="1" height="1"/><rect x="1" y="6" width="1" height="1"/><rect x="2" y="6" width="1" height="1"/><rect x="3" y="6" width="1" height="1"/></g><g><rect x="6" y="0" width="1" height="1"/><rect x="10" y="0" width="1" height="1"/><rect x="6" y="1" width="1" height="1"/><rect x="10" y="1" width="1" height="1"/><rect x="6" y="2" width="1" height="1"/><rect x="10" y="2" width="1" height="1"/><rect x="6" y="3" width="1" height="1"/><rect x="10" y="3" width="1" height="1"/><rect x="6" y="4" width="1" height="1"/><rect x="10" y="4" width="1" height="1"/><rect x="6" y="5" width="1" height="1"/><rect x="10" y="5" width="1" height="1"/><rect x="7" y="6" width="1" height="1"/><rect x="8" y="6" width="1" height="1"/><rect x="9" y="6" width="1" height="1"/></g><g><rect x="12" y="0" width="1" height="1"/><rect x="13" y="0" width="1" height="1"/><rect x="14" y="0" width="1" height="1"/><rect x="15" y="0" width="1" height="1"/><rect x="12" y="1" width="1" height="1"/><rect x="16" y="1" width="1" height="1"/><rect x="12" y="2" width="1" height="1"/><rect x="16" y="2" width="1" height="1"/><rect x="12" y="3" width="1" height="1"/><rect x="13" y="3" width="1" height="1"/><rect x="14" y="3" width="1" height="1"/><rect x="15" y="3" width="1" height="1"/><rect x="12" y="4" width="1" height="1"/><rect x="16" y="4" width="1" height="1"/><rect x="12" y="5" width="1" height="1"/><rect x="16" y="5" width="1" height="1"/><rect x="12" y="6" width="1" height="1"/><rect x="13" y="6" width="1" height="1"/><rect x="14" y="6" width="1" height="1"/><rect x="15" y="6" width="1" height="1"/></g><g class="brand-name-accent"><rect x="18" y="0" width="1" height="1"/><rect x="22" y="0" width="1" height="1"/><rect x="18" y="1" width="1" height="1"/><rect x="22" y="1" width="1" height="1"/><rect x="18" y="2" width="1" height="1"/><rect x="22" y="2" width="1" height="1"/><rect x="18" y="3" width="1" height="1"/><rect x="22" y="3" width="1" height="1"/><rect x="18" y="4" width="1" height="1"/><rect x="22" y="4" width="1" height="1"/><rect x="19" y="5" width="1" height="1"/><rect x="21" y="5" width="1" height="1"/><rect x="20" y="6" width="1" height="1"/></g><g class="brand-name-accent"><rect x="25" y="0" width="1" height="1"/><rect x="26" y="0" width="1" height="1"/><rect x="27" y="0" width="1" height="1"/><rect x="24" y="1" width="1" height="1"/><rect x="28" y="1" width="1" height="1"/><rect x="24" y="2" width="1" height="1"/><rect x="28" y="2" width="1" height="1"/><rect x="24" y="3" width="1" height="1"/><rect x="25" y="3" width="1" height="1"/><rect x="26" y="3" width="1" height="1"/><rect x="27" y="3" width="1" height="1"/><rect x="28" y="3" width="1" height="1"/><rect x="24" y="4" width="1" height="1"/><rect x="28" y="4" width="1" height="1"/><rect x="24" y="5" width="1" height="1"/><rect x="28" y="5" width="1" height="1"/><rect x="24" y="6" width="1" height="1"/><rect x="28" y="6" width="1" height="1"/></g><g class="brand-name-accent"><rect x="30" y="0" width="1" height="1"/><rect x="30" y="1" width="1" height="1"/><rect x="30" y="2" width="1" height="1"/><rect x="30" y="3" width="1" height="1"/><rect x="30" y="4" width="1" height="1"/><rect x="30" y="5" width="1" height="1"/><rect x="30" y="6" width="1" height="1"/><rect x="31" y="6" width="1" height="1"/><rect x="32" y="6" width="1" height="1"/><rect x="33" y="6" width="1" height="1"/></g><g class="brand-name-accent"><rect x="35" y="0" width="1" height="1"/><rect x="39" y="0" width="1" height="1"/><rect x="35" y="1" width="1" height="1"/><rect x="39" y="1" width="1" height="1"/><rect x="35" y="2" width="1" height="1"/><rect x="39" y="2" width="1" height="1"/><rect x="35" y="3" width="1" height="1"/><rect x="39" y="3" width="1" height="1"/><rect x="35" y="4" width="1" height="1"/><rect x="39" y="4" width="1" height="1"/><rect x="35" y="5" width="1" height="1"/><rect x="39" y="5" width="1" height="1"/><rect x="36" y="6" width="1" height="1"/><rect x="37" y="6" width="1" height="1"/><rect x="38" y="6" width="1" height="1"/></g><g class="brand-name-accent"><rect x="41" y="0" width="1" height="1"/><rect x="42" y="0" width="1" height="1"/><rect x="43" y="0" width="1" height="1"/><rect x="44" y="0" width="1" height="1"/><rect x="45" y="0" width="1" height="1"/><rect x="41" y="1" width="1" height="1"/><rect x="41" y="2" width="1" height="1"/><rect x="41" y="3" width="1" height="1"/><rect x="42" y="3" width="1" height="1"/><rect x="43" y="3" width="1" height="1"/><rect x="44" y="3" width="1" height="1"/><rect x="41" y="4" width="1" height="1"/><rect x="41" y="5" width="1" height="1"/><rect x="41" y="6" width="1" height="1"/><rect x="42" y="6" width="1" height="1"/><rect x="43" y="6" width="1" height="1"/><rect x="44" y="6" width="1" height="1"/><rect x="45" y="6" width="1" height="1"/></g></svg></span></a><a class="privacy-back" href="/">← Back</a></header><main id="policy" class="privacy-document" tabindex="-1"><article><h1>Privacy and data access</h1>
2
2
  <p>SubValue processes usage on the user&#39;s machine. It has no account, cloud usage database, telemetry SDK or runtime upload endpoint.</p>
3
3
  <h2>Files read</h2>
4
4
  <p>Only these provider sources are opened for usage analysis:</p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subvalue/cli",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Local, read-only Codex and Claude Code API-equivalent usage dashboard",
5
5
  "type": "module",
6
6
  "license": "MIT",