OXYGENHUB

Project skeleton in Oxygen's shape: workspace, deps/oxygen pinned, make check, version, deps-check (#1) 258bb3824813

Author
Andy McCall @andymccall <[email protected]>
via
agent agent:claude@andymccall <[email protected]> · keyless, under your grant for changes,refs,seal · key 5b4beae3cba3
When
· 2026-11-02 21:38 UTC
Signature
◈ sealed by agent:claude@andymccall
Hash
258bb3824813c41f04088e68bc8c56d41fc18373f6b7a74f7567454ce0d0a1ee
Depends on
8dc6df8c4d4e
Depended on by
2d2dcb7a2778 1876f2ce71e4 862f0db224aa fe6b29c66cd4 87f601ccce6d 8d803d858c8c f4b3e9369e28 58e1ce30ae58 c7161ec1a607 b044d90930d9 f7986cb07b0e 8f87df88babf 98a0fb9f0948 813b6330f3ad aa72eb904932 01320eefd505 67bfa06a894f eca5af92279b 77df591d5a2f b576d05cf862 d17cbc7069ce 98a16830a3d3 da84e98f104e e071e91a14ef 8cfb9269bb14 39f5c913f617 eb675dfa5e18 037c45d8093c 571572f5fb2c 5eb57578f4ef 2fc88a7b3a5c 5d695d869fbf 09752034b5a8 36537112fcac 366e358ff5e7 ad258dc8cf5e
In bookmarks
main
In tags
v0.1.0
Edits
27 atoms, 40 tree operations, 27 files

Browse the tree at this change

added .oxyattributes +2 −0
1 +
# oxygen#145: two changes adding changelog entries keep both.
2 +
CHANGELOG.md merge=union
added .oxyignore +4 −0
1 +
/target
2 +
*.tmp
3 +
/.claude
4 +
/data
added .oxymodules +3 −0
1 +
[deps/oxygen]
2 +
url = https://oxygenhub.io/andymccall/oxygen
3 +
added CHANGELOG.md +5 −0
1 +
# Changelog
2 +
3 +
## Unreleased
4 +
5 +
- **Added: the project skeleton (#1).** A Cargo workspace in Oxygen's shape (`spectra-core`, `spectra-mcp`, `spectra-api`, `radar` and the `spectra` binary), Oxygen pinned under `deps/oxygen` for identities and signatures, `make check`, the changelog check, `spectra version [--json]` with the build identity, and `scripts/deps-check.sh` to keep Spectra buildable by the vendored OxygenFlow image.
added Cargo.lock +1994 −0
1 +
# This file is automatically @generated by Cargo.
2 +
# It is not intended for manual editing.
3 +
version = 4
4 +
5 +
[[package]]
6 +
name = "adler2"
7 +
version = "2.0.1"
8 +
source = "registry+https://github.com/rust-lang/crates.io-index"
9 +
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
10 +
11 +
[[package]]
12 +
name = "aho-corasick"
13 +
version = "1.1.5"
14 +
source = "registry+https://github.com/rust-lang/crates.io-index"
15 +
checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
16 +
dependencies = [
17 +
 "memchr",
18 +
]
19 +
20 +
[[package]]
21 +
name = "anstream"
22 +
version = "1.0.0"
23 +
source = "registry+https://github.com/rust-lang/crates.io-index"
24 +
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
25 +
dependencies = [
26 +
 "anstyle",
27 +
 "anstyle-parse",
28 +
 "anstyle-query",
29 +
 "anstyle-wincon",
30 +
 "colorchoice",
31 +
 "is_terminal_polyfill",
32 +
 "utf8parse",
33 +
]
34 +
35 +
[[package]]
36 +
name = "anstyle"
37 +
version = "1.0.14"
38 +
source = "registry+https://github.com/rust-lang/crates.io-index"
39 +
checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
40 +
41 +
[[package]]
42 +
name = "anstyle-parse"
43 +
version = "1.0.0"
44 +
source = "registry+https://github.com/rust-lang/crates.io-index"
45 +
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
46 +
dependencies = [
47 +
 "utf8parse",
48 +
]
49 +
50 +
[[package]]
51 +
name = "anstyle-query"
52 +
version = "1.1.5"
53 +
source = "registry+https://github.com/rust-lang/crates.io-index"
54 +
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
55 +
dependencies = [
56 +
 "windows-sys 0.61.2",
57 +
]
58 +
59 +
[[package]]
60 +
name = "anstyle-wincon"
61 +
version = "3.0.11"
62 +
source = "registry+https://github.com/rust-lang/crates.io-index"
63 +
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
64 +
dependencies = [
65 +
 "anstyle",
66 +
 "once_cell_polyfill",
67 +
 "windows-sys 0.61.2",
68 +
]
69 +
70 +
[[package]]
71 +
name = "anyhow"
72 +
version = "1.0.104"
73 +
source = "registry+https://github.com/rust-lang/crates.io-index"
74 +
checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
75 +
76 +
[[package]]
77 +
name = "arrayvec"
78 +
version = "0.7.8"
79 +
source = "registry+https://github.com/rust-lang/crates.io-index"
80 +
checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56"
81 +
82 +
[[package]]
83 +
name = "autocfg"
84 +
version = "1.5.1"
85 +
source = "registry+https://github.com/rust-lang/crates.io-index"
86 +
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
87 +
88 +
[[package]]
89 +
name = "base64"
90 +
version = "0.22.1"
91 +
source = "registry+https://github.com/rust-lang/crates.io-index"
92 +
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
93 +
94 +
[[package]]
95 +
name = "base64ct"
96 +
version = "1.8.3"
97 +
source = "registry+https://github.com/rust-lang/crates.io-index"
98 +
checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
99 +
100 +
[[package]]
101 +
name = "bit-set"
102 +
version = "0.8.0"
103 +
source = "registry+https://github.com/rust-lang/crates.io-index"
104 +
checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
105 +
dependencies = [
106 +
 "bit-vec",
107 +
]
108 +
109 +
[[package]]
110 +
name = "bit-vec"
111 +
version = "0.8.0"
112 +
source = "registry+https://github.com/rust-lang/crates.io-index"
113 +
checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
114 +
115 +
[[package]]
116 +
name = "bitflags"
117 +
version = "2.13.2"
118 +
source = "registry+https://github.com/rust-lang/crates.io-index"
119 +
checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
120 +
121 +
[[package]]
122 +
name = "blake3"
123 +
version = "1.8.7"
124 +
source = "registry+https://github.com/rust-lang/crates.io-index"
125 +
checksum = "6d9e454fc11f76977dc803893aff6304ed33d6a26efae8696573bea74baa27ae"
126 +
dependencies = [
127 +
 "arrayvec",
128 +
 "cc",
129 +
 "cfg-if",
130 +
 "constant_time_eq",
131 +
 "cpufeatures",
132 +
 "rayon-core",
133 +
]
134 +
135 +
[[package]]
136 +
name = "block-buffer"
137 +
version = "0.12.1"
138 +
source = "registry+https://github.com/rust-lang/crates.io-index"
139 +
checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa"
140 +
dependencies = [
141 +
 "hybrid-array",
142 +
]
143 +
144 +
[[package]]
145 +
name = "bstr"
146 +
version = "1.13.1"
147 +
source = "registry+https://github.com/rust-lang/crates.io-index"
148 +
checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f"
149 +
dependencies = [
150 +
 "memchr",
151 +
 "serde_core",
152 +
]
153 +
154 +
[[package]]
155 +
name = "bumpalo"
156 +
version = "3.20.3"
157 +
source = "registry+https://github.com/rust-lang/crates.io-index"
158 +
checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
159 +
160 +
[[package]]
161 +
name = "bytes"
162 +
version = "1.12.1"
163 +
source = "registry+https://github.com/rust-lang/crates.io-index"
164 +
checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
165 +
166 +
[[package]]
167 +
name = "cc"
168 +
version = "1.5.1"
169 +
source = "registry+https://github.com/rust-lang/crates.io-index"
170 +
checksum = "f360145194ee8e21db5ee7f3fcd4fe52210864c75c985dae33218202c8bbe040"
171 +
dependencies = [
172 +
 "find-msvc-tools",
173 +
 "jobserver",
174 +
 "libc",
175 +
 "shlex",
176 +
]
177 +
178 +
[[package]]
179 +
name = "cfg-if"
180 +
version = "1.0.5"
181 +
source = "registry+https://github.com/rust-lang/crates.io-index"
182 +
checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
183 +
184 +
[[package]]
185 +
name = "clap"
186 +
version = "4.6.7"
187 +
source = "registry+https://github.com/rust-lang/crates.io-index"
188 +
checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946"
189 +
dependencies = [
190 +
 "clap_builder",
191 +
 "clap_derive",
192 +
]
193 +
194 +
[[package]]
195 +
name = "clap_builder"
196 +
version = "4.6.7"
197 +
source = "registry+https://github.com/rust-lang/crates.io-index"
198 +
checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d"
199 +
dependencies = [
200 +
 "anstream",
201 +
 "anstyle",
202 +
 "clap_lex",
203 +
 "strsim",
204 +
]
205 +
206 +
[[package]]
207 +
name = "clap_derive"
208 +
version = "4.6.7"
209 +
source = "registry+https://github.com/rust-lang/crates.io-index"
210 +
checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0"
211 +
dependencies = [
212 +
 "heck",
213 +
 "proc-macro2",
214 +
 "quote",
215 +
 "syn 3.0.6",
216 +
]
217 +
218 +
[[package]]
219 +
name = "clap_lex"
220 +
version = "1.1.1"
221 +
source = "registry+https://github.com/rust-lang/crates.io-index"
222 +
checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486"
223 +
224 +
[[package]]
225 +
name = "cmov"
226 +
version = "0.5.4"
227 +
source = "registry+https://github.com/rust-lang/crates.io-index"
228 +
checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a"
229 +
230 +
[[package]]
231 +
name = "colorchoice"
232 +
version = "1.0.5"
233 +
source = "registry+https://github.com/rust-lang/crates.io-index"
234 +
checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
235 +
236 +
[[package]]
237 +
name = "console"
238 +
version = "0.15.11"
239 +
source = "registry+https://github.com/rust-lang/crates.io-index"
240 +
checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8"
241 +
dependencies = [
242 +
 "encode_unicode",
243 +
 "libc",
244 +
 "once_cell",
245 +
 "unicode-width",
246 +
 "windows-sys 0.59.0",
247 +
]
248 +
249 +
[[package]]
250 +
name = "const-oid"
251 +
version = "0.10.2"
252 +
source = "registry+https://github.com/rust-lang/crates.io-index"
253 +
checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c"
254 +
255 +
[[package]]
256 +
name = "constant_time_eq"
257 +
version = "0.4.2"
258 +
source = "registry+https://github.com/rust-lang/crates.io-index"
259 +
checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b"
260 +
261 +
[[package]]
262 +
name = "cpufeatures"
263 +
version = "0.3.1"
264 +
source = "registry+https://github.com/rust-lang/crates.io-index"
265 +
checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566"
266 +
dependencies = [
267 +
 "libc",
268 +
]
269 +
270 +
[[package]]
271 +
name = "crc32fast"
272 +
version = "1.5.2"
273 +
source = "registry+https://github.com/rust-lang/crates.io-index"
274 +
checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78"
275 +
dependencies = [
276 +
 "cfg-if",
277 +
]
278 +
279 +
[[package]]
280 +
name = "crossbeam-deque"
281 +
version = "0.8.8"
282 +
source = "registry+https://github.com/rust-lang/crates.io-index"
283 +
checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a"
284 +
dependencies = [
285 +
 "crossbeam-epoch",
286 +
 "crossbeam-utils",
287 +
]
288 +
289 +
[[package]]
290 +
name = "crossbeam-epoch"
291 +
version = "0.9.21"
292 +
source = "registry+https://github.com/rust-lang/crates.io-index"
293 +
checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d"
294 +
dependencies = [
295 +
 "crossbeam-utils",
296 +
]
297 +
298 +
[[package]]
299 +
name = "crossbeam-utils"
300 +
version = "0.8.23"
301 +
source = "registry+https://github.com/rust-lang/crates.io-index"
302 +
checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
303 +
304 +
[[package]]
305 +
name = "crypto-common"
306 +
version = "0.2.2"
307 +
source = "registry+https://github.com/rust-lang/crates.io-index"
308 +
checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453"
309 +
dependencies = [
310 +
 "getrandom 0.4.3",
311 +
 "hybrid-array",
312 +
 "rand_core 0.10.1",
313 +
]
314 +
315 +
[[package]]
316 +
name = "ctutils"
317 +
version = "0.4.2"
318 +
source = "registry+https://github.com/rust-lang/crates.io-index"
319 +
checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e"
320 +
dependencies = [
321 +
 "cmov",
322 +
]
323 +
324 +
[[package]]
325 +
name = "curve25519-dalek"
326 +
version = "5.0.0"
327 +
source = "registry+https://github.com/rust-lang/crates.io-index"
328 +
checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23"
329 +
dependencies = [
330 +
 "cfg-if",
331 +
 "cpufeatures",
332 +
 "curve25519-dalek-derive",
333 +
 "digest",
334 +
 "fiat-crypto",
335 +
 "rustc_version",
336 +
 "subtle",
337 +
 "zeroize",
338 +
]
339 +
340 +
[[package]]
341 +
name = "curve25519-dalek-derive"
342 +
version = "0.1.1"
343 +
source = "registry+https://github.com/rust-lang/crates.io-index"
344 +
checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
345 +
dependencies = [
346 +
 "proc-macro2",
347 +
 "quote",
348 +
 "syn 2.0.119",
349 +
]
350 +
351 +
[[package]]
352 +
name = "der"
353 +
version = "0.8.2"
354 +
source = "registry+https://github.com/rust-lang/crates.io-index"
355 +
checksum = "a878c850e9e421b20262e9b41f9c860e4785fa07541c266b62ff9d1ef998a80a"
356 +
dependencies = [
357 +
 "const-oid",
358 +
 "zeroize",
359 +
]
360 +
361 +
[[package]]
362 +
name = "digest"
363 +
version = "0.11.3"
364 +
source = "registry+https://github.com/rust-lang/crates.io-index"
365 +
checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2"
366 +
dependencies = [
367 +
 "block-buffer",
368 +
 "const-oid",
369 +
 "crypto-common",
370 +
]
371 +
372 +
[[package]]
373 +
name = "displaydoc"
374 +
version = "0.2.7"
375 +
source = "registry+https://github.com/rust-lang/crates.io-index"
376 +
checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
377 +
dependencies = [
378 +
 "proc-macro2",
379 +
 "quote",
380 +
 "syn 3.0.6",
381 +
]
382 +
383 +
[[package]]
384 +
name = "ed25519"
385 +
version = "3.0.0"
386 +
source = "registry+https://github.com/rust-lang/crates.io-index"
387 +
checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a"
388 +
dependencies = [
389 +
 "signature",
390 +
]
391 +
392 +
[[package]]
393 +
name = "ed25519-dalek"
394 +
version = "3.0.0"
395 +
source = "registry+https://github.com/rust-lang/crates.io-index"
396 +
checksum = "6ebaa1a2bf1290ab3bfe5a7b771d050ebffab2711c19a81691c683a5144a25de"
397 +
dependencies = [
398 +
 "curve25519-dalek",
399 +
 "ed25519",
400 +
 "sha2",
401 +
 "subtle",
402 +
 "zeroize",
403 +
]
404 +
405 +
[[package]]
406 +
name = "either"
407 +
version = "1.18.0"
408 +
source = "registry+https://github.com/rust-lang/crates.io-index"
409 +
checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34"
410 +
411 +
[[package]]
412 +
name = "encode_unicode"
413 +
version = "1.0.0"
414 +
source = "registry+https://github.com/rust-lang/crates.io-index"
415 +
checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
416 +
417 +
[[package]]
418 +
name = "errno"
419 +
version = "0.3.14"
420 +
source = "registry+https://github.com/rust-lang/crates.io-index"
421 +
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
422 +
dependencies = [
423 +
 "libc",
424 +
 "windows-sys 0.52.0",
425 +
]
426 +
427 +
[[package]]
428 +
name = "fastrand"
429 +
version = "2.5.0"
430 +
source = "registry+https://github.com/rust-lang/crates.io-index"
431 +
checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
432 +
433 +
[[package]]
434 +
name = "fiat-crypto"
435 +
version = "0.3.0"
436 +
source = "registry+https://github.com/rust-lang/crates.io-index"
437 +
checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24"
438 +
439 +
[[package]]
440 +
name = "find-msvc-tools"
441 +
version = "0.1.14"
442 +
source = "registry+https://github.com/rust-lang/crates.io-index"
443 +
checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484"
444 +
445 +
[[package]]
446 +
name = "flate2"
447 +
version = "1.1.10"
448 +
source = "registry+https://github.com/rust-lang/crates.io-index"
449 +
checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb"
450 +
dependencies = [
451 +
 "crc32fast",
452 +
 "miniz_oxide",
453 +
 "zlib-rs",
454 +
]
455 +
456 +
[[package]]
457 +
name = "fnv"
458 +
version = "1.0.7"
459 +
source = "registry+https://github.com/rust-lang/crates.io-index"
460 +
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
461 +
462 +
[[package]]
463 +
name = "form_urlencoded"
464 +
version = "1.2.2"
465 +
source = "registry+https://github.com/rust-lang/crates.io-index"
466 +
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
467 +
dependencies = [
468 +
 "percent-encoding",
469 +
]
470 +
471 +
[[package]]
472 +
name = "futures-core"
473 +
version = "0.3.34"
474 +
source = "registry+https://github.com/rust-lang/crates.io-index"
475 +
checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
476 +
477 +
[[package]]
478 +
name = "futures-task"
479 +
version = "0.3.34"
480 +
source = "registry+https://github.com/rust-lang/crates.io-index"
481 +
checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
482 +
483 +
[[package]]
484 +
name = "futures-util"
485 +
version = "0.3.34"
486 +
source = "registry+https://github.com/rust-lang/crates.io-index"
487 +
checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
488 +
dependencies = [
489 +
 "futures-core",
490 +
 "futures-task",
491 +
 "pin-project-lite",
492 +
 "slab",
493 +
]
494 +
495 +
[[package]]
496 +
name = "getrandom"
497 +
version = "0.2.17"
498 +
source = "registry+https://github.com/rust-lang/crates.io-index"
499 +
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
500 +
dependencies = [
501 +
 "cfg-if",
502 +
 "libc",
503 +
 "wasi",
504 +
]
505 +
506 +
[[package]]
507 +
name = "getrandom"
508 +
version = "0.3.4"
509 +
source = "registry+https://github.com/rust-lang/crates.io-index"
510 +
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
511 +
dependencies = [
512 +
 "cfg-if",
513 +
 "libc",
514 +
 "r-efi 5.3.0",
515 +
 "wasip2",
516 +
]
517 +
518 +
[[package]]
519 +
name = "getrandom"
520 +
version = "0.4.3"
521 +
source = "registry+https://github.com/rust-lang/crates.io-index"
522 +
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
523 +
dependencies = [
524 +
 "cfg-if",
525 +
 "libc",
526 +
 "r-efi 6.0.0",
527 +
 "rand_core 0.10.1",
528 +
]
529 +
530 +
[[package]]
531 +
name = "globset"
532 +
version = "0.4.20"
533 +
source = "registry+https://github.com/rust-lang/crates.io-index"
534 +
checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988"
535 +
dependencies = [
536 +
 "aho-corasick",
537 +
 "bstr",
538 +
 "log",
539 +
 "regex-automata",
540 +
 "regex-syntax",
541 +
]
542 +
543 +
[[package]]
544 +
name = "heck"
545 +
version = "0.5.0"
546 +
source = "registry+https://github.com/rust-lang/crates.io-index"
547 +
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
548 +
549 +
[[package]]
550 +
name = "hex"
551 +
version = "0.4.3"
552 +
source = "registry+https://github.com/rust-lang/crates.io-index"
553 +
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
554 +
555 +
[[package]]
556 +
name = "hybrid-array"
557 +
version = "0.4.15"
558 +
source = "registry+https://github.com/rust-lang/crates.io-index"
559 +
checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17"
560 +
dependencies = [
561 +
 "ctutils",
562 +
 "typenum",
563 +
]
564 +
565 +
[[package]]
566 +
name = "icu_collections"
567 +
version = "2.3.0"
568 +
source = "registry+https://github.com/rust-lang/crates.io-index"
569 +
checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513"
570 +
dependencies = [
571 +
 "displaydoc",
572 +
 "potential_utf",
573 +
 "utf8_iter",
574 +
 "yoke",
575 +
 "zerofrom",
576 +
 "zerovec",
577 +
]
578 +
579 +
[[package]]
580 +
name = "icu_locale_core"
581 +
version = "2.3.0"
582 +
source = "registry+https://github.com/rust-lang/crates.io-index"
583 +
checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb"
584 +
dependencies = [
585 +
 "displaydoc",
586 +
 "litemap",
587 +
 "tinystr",
588 +
 "writeable",
589 +
 "zerovec",
590 +
]
591 +
592 +
[[package]]
593 +
name = "icu_normalizer"
594 +
version = "2.3.0"
595 +
source = "registry+https://github.com/rust-lang/crates.io-index"
596 +
checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f"
597 +
dependencies = [
598 +
 "icu_collections",
599 +
 "icu_normalizer_data",
600 +
 "icu_properties",
601 +
 "icu_provider",
602 +
 "smallvec",
603 +
 "zerovec",
604 +
]
605 +
606 +
[[package]]
607 +
name = "icu_normalizer_data"
608 +
version = "2.3.0"
609 +
source = "registry+https://github.com/rust-lang/crates.io-index"
610 +
checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0"
611 +
612 +
[[package]]
613 +
name = "icu_properties"
614 +
version = "2.3.0"
615 +
source = "registry+https://github.com/rust-lang/crates.io-index"
616 +
checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148"
617 +
dependencies = [
618 +
 "displaydoc",
619 +
 "icu_collections",
620 +
 "icu_locale_core",
621 +
 "icu_properties_data",
622 +
 "icu_provider",
623 +
 "zerotrie",
624 +
 "zerovec",
625 +
]
626 +
627 +
[[package]]
628 +
name = "icu_properties_data"
629 +
version = "2.3.0"
630 +
source = "registry+https://github.com/rust-lang/crates.io-index"
631 +
checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa"
632 +
633 +
[[package]]
634 +
name = "icu_provider"
635 +
version = "2.3.1"
636 +
source = "registry+https://github.com/rust-lang/crates.io-index"
637 +
checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73"
638 +
dependencies = [
639 +
 "displaydoc",
640 +
 "icu_locale_core",
641 +
 "writeable",
642 +
 "yoke",
643 +
 "zerofrom",
644 +
 "zerotrie",
645 +
 "zerovec",
646 +
]
647 +
648 +
[[package]]
649 +
name = "idna"
650 +
version = "1.1.0"
651 +
source = "registry+https://github.com/rust-lang/crates.io-index"
652 +
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
653 +
dependencies = [
654 +
 "idna_adapter",
655 +
 "smallvec",
656 +
 "utf8_iter",
657 +
]
658 +
659 +
[[package]]
660 +
name = "idna_adapter"
661 +
version = "1.2.2"
662 +
source = "registry+https://github.com/rust-lang/crates.io-index"
663 +
checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"
664 +
dependencies = [
665 +
 "icu_normalizer",
666 +
 "icu_properties",
667 +
]
668 +
669 +
[[package]]
670 +
name = "ignore"
671 +
version = "0.4.33"
672 +
source = "registry+https://github.com/rust-lang/crates.io-index"
673 +
checksum = "00b69833ed729dc5aa7d19541d96d6cf8e9137194207a04916d658e43168402f"
674 +
dependencies = [
675 +
 "crossbeam-deque",
676 +
 "globset",
677 +
 "log",
678 +
 "memchr",
679 +
 "regex-automata",
680 +
 "same-file",
681 +
 "walkdir",
682 +
 "winapi-util",
683 +
]
684 +
685 +
[[package]]
686 +
name = "indicatif"
687 +
version = "0.17.11"
688 +
source = "registry+https://github.com/rust-lang/crates.io-index"
689 +
checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235"
690 +
dependencies = [
691 +
 "console",
692 +
 "number_prefix",
693 +
 "portable-atomic",
694 +
 "unicode-width",
695 +
 "web-time",
696 +
]
697 +
698 +
[[package]]
699 +
name = "is_terminal_polyfill"
700 +
version = "1.70.2"
701 +
source = "registry+https://github.com/rust-lang/crates.io-index"
702 +
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
703 +
704 +
[[package]]
705 +
name = "itoa"
706 +
version = "1.0.18"
707 +
source = "registry+https://github.com/rust-lang/crates.io-index"
708 +
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
709 +
710 +
[[package]]
711 +
name = "jobserver"
712 +
version = "0.1.35"
713 +
source = "registry+https://github.com/rust-lang/crates.io-index"
714 +
checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3"
715 +
dependencies = [
716 +
 "getrandom 0.4.3",
717 +
 "libc",
718 +
]
719 +
720 +
[[package]]
721 +
name = "js-sys"
722 +
version = "0.3.106"
723 +
source = "registry+https://github.com/rust-lang/crates.io-index"
724 +
checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5"
725 +
dependencies = [
726 +
 "cfg-if",
727 +
 "futures-util",
728 +
 "wasm-bindgen",
729 +
]
730 +
731 +
[[package]]
732 +
name = "keccak"
733 +
version = "0.2.2"
734 +
source = "registry+https://github.com/rust-lang/crates.io-index"
735 +
checksum = "d8f198d1db720e4940b5a493201d199d9f24f568f8f746bd13706243a2f71598"
736 +
dependencies = [
737 +
 "cfg-if",
738 +
 "cpufeatures",
739 +
]
740 +
741 +
[[package]]
742 +
name = "libc"
743 +
version = "0.2.189"
744 +
source = "registry+https://github.com/rust-lang/crates.io-index"
745 +
checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
746 +
747 +
[[package]]
748 +
name = "libmimalloc-sys"
749 +
version = "0.1.49"
750 +
source = "registry+https://github.com/rust-lang/crates.io-index"
751 +
checksum = "6a45a52f43e1c16f667ccfe4dd8c85b7f7c204fd5e3bf46c5b0db9a5c3c0b8e9"
752 +
dependencies = [
753 +
 "cc",
754 +
]
755 +
756 +
[[package]]
757 +
name = "linux-raw-sys"
758 +
version = "0.12.1"
759 +
source = "registry+https://github.com/rust-lang/crates.io-index"
760 +
checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
761 +
762 +
[[package]]
763 +
name = "litemap"
764 +
version = "0.8.3"
765 +
source = "registry+https://github.com/rust-lang/crates.io-index"
766 +
checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae"
767 +
768 +
[[package]]
769 +
name = "log"
770 +
version = "0.4.34"
771 +
source = "registry+https://github.com/rust-lang/crates.io-index"
772 +
checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6"
773 +
774 +
[[package]]
775 +
name = "memchr"
776 +
version = "2.8.3"
777 +
source = "registry+https://github.com/rust-lang/crates.io-index"
778 +
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
779 +
780 +
[[package]]
781 +
name = "mimalloc"
782 +
version = "0.1.52"
783 +
source = "registry+https://github.com/rust-lang/crates.io-index"
784 +
checksum = "2d4139bb28d14ad1facf21d5eb8825051b326e172d216b39f6d31df53cc97862"
785 +
dependencies = [
786 +
 "libmimalloc-sys",
787 +
]
788 +
789 +
[[package]]
790 +
name = "miniz_oxide"
791 +
version = "0.9.1"
792 +
source = "registry+https://github.com/rust-lang/crates.io-index"
793 +
checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c"
794 +
dependencies = [
795 +
 "adler2",
796 +
 "simd-adler32",
797 +
]
798 +
799 +
[[package]]
800 +
name = "mio"
801 +
version = "1.2.3"
802 +
source = "registry+https://github.com/rust-lang/crates.io-index"
803 +
checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8"
804 +
dependencies = [
805 +
 "libc",
806 +
 "wasi",
807 +
 "windows-sys 0.61.2",
808 +
]
809 +
810 +
[[package]]
811 +
name = "ml-dsa"
812 +
version = "0.1.1"
813 +
source = "registry+https://github.com/rust-lang/crates.io-index"
814 +
checksum = "add6b9d92e496f16f4526d68ff29da1483aba4b119baeab8bed3b9e3544a6f3d"
815 +
dependencies = [
816 +
 "const-oid",
817 +
 "crypto-common",
818 +
 "ctutils",
819 +
 "hybrid-array",
820 +
 "module-lattice",
821 +
 "pkcs8",
822 +
 "shake",
823 +
 "signature",
824 +
]
825 +
826 +
[[package]]
827 +
name = "module-lattice"
828 +
version = "0.2.3"
829 +
source = "registry+https://github.com/rust-lang/crates.io-index"
830 +
checksum = "0c61b87c9683ab7cb1c6871d261ad5479b6b10ceb52c4352aaca3b5d35a8febe"
831 +
dependencies = [
832 +
 "ctutils",
833 +
 "hybrid-array",
834 +
 "num-traits",
835 +
]
836 +
837 +
[[package]]
838 +
name = "num-traits"
839 +
version = "0.2.19"
840 +
source = "registry+https://github.com/rust-lang/crates.io-index"
841 +
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
842 +
dependencies = [
843 +
 "autocfg",
844 +
]
845 +
846 +
[[package]]
847 +
name = "number_prefix"
848 +
version = "0.4.0"
849 +
source = "registry+https://github.com/rust-lang/crates.io-index"
850 +
checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
851 +
852 +
[[package]]
853 +
name = "once_cell"
854 +
version = "1.21.4"
855 +
source = "registry+https://github.com/rust-lang/crates.io-index"
856 +
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
857 +
858 +
[[package]]
859 +
name = "once_cell_polyfill"
860 +
version = "1.70.2"
861 +
source = "registry+https://github.com/rust-lang/crates.io-index"
862 +
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
863 +
864 +
[[package]]
865 +
name = "oxy-core"
866 +
version = "0.1.0"
867 +
dependencies = [
868 +
 "blake3",
869 +
 "ed25519-dalek",
870 +
 "globset",
871 +
 "hex",
872 +
 "ignore",
873 +
 "libc",
874 +
 "memchr",
875 +
 "ml-dsa",
876 +
 "proptest",
877 +
 "rand 0.8.8",
878 +
 "rayon",
879 +
 "rustls",
880 +
 "rustls-pemfile",
881 +
 "serde_json",
882 +
 "sha2",
883 +
 "similar",
884 +
 "tempfile",
885 +
 "thiserror 1.0.69",
886 +
 "ureq",
887 +
 "webpki-roots 1.0.9",
888 +
 "zstd",
889 +
]
890 +
891 +
[[package]]
892 +
name = "percent-encoding"
893 +
version = "2.3.2"
894 +
source = "registry+https://github.com/rust-lang/crates.io-index"
895 +
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
896 +
897 +
[[package]]
898 +
name = "pin-project-lite"
899 +
version = "0.2.17"
900 +
source = "registry+https://github.com/rust-lang/crates.io-index"
901 +
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
902 +
903 +
[[package]]
904 +
name = "pkcs8"
905 +
version = "0.11.0"
906 +
source = "registry+https://github.com/rust-lang/crates.io-index"
907 +
checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7"
908 +
dependencies = [
909 +
 "der",
910 +
 "spki",
911 +
]
912 +
913 +
[[package]]
914 +
name = "pkg-config"
915 +
version = "0.3.34"
916 +
source = "registry+https://github.com/rust-lang/crates.io-index"
917 +
checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548"
918 +
919 +
[[package]]
920 +
name = "portable-atomic"
921 +
version = "1.15.0"
922 +
source = "registry+https://github.com/rust-lang/crates.io-index"
923 +
checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
924 +
925 +
[[package]]
926 +
name = "potential_utf"
927 +
version = "0.1.6"
928 +
source = "registry+https://github.com/rust-lang/crates.io-index"
929 +
checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661"
930 +
dependencies = [
931 +
 "zerovec",
932 +
]
933 +
934 +
[[package]]
935 +
name = "ppv-lite86"
936 +
version = "0.2.21"
937 +
source = "registry+https://github.com/rust-lang/crates.io-index"
938 +
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
939 +
dependencies = [
940 +
 "zerocopy",
941 +
]
942 +
943 +
[[package]]
944 +
name = "proc-macro2"
945 +
version = "1.0.107"
946 +
source = "registry+https://github.com/rust-lang/crates.io-index"
947 +
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
948 +
dependencies = [
949 +
 "unicode-ident",
950 +
]
951 +
952 +
[[package]]
953 +
name = "proptest"
954 +
version = "1.11.0"
955 +
source = "registry+https://github.com/rust-lang/crates.io-index"
956 +
checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744"
957 +
dependencies = [
958 +
 "bit-set",
959 +
 "bit-vec",
960 +
 "bitflags",
961 +
 "num-traits",
962 +
 "rand 0.9.5",
963 +
 "rand_chacha 0.9.0",
964 +
 "rand_xorshift",
965 +
 "regex-syntax",
966 +
 "rusty-fork",
967 +
 "tempfile",
968 +
 "unarray",
969 +
]
970 +
971 +
[[package]]
972 +
name = "quick-error"
973 +
version = "1.2.3"
974 +
source = "registry+https://github.com/rust-lang/crates.io-index"
975 +
checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
976 +
977 +
[[package]]
978 +
name = "quote"
979 +
version = "1.0.47"
980 +
source = "registry+https://github.com/rust-lang/crates.io-index"
981 +
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
982 +
dependencies = [
983 +
 "proc-macro2",
984 +
]
985 +
986 +
[[package]]
987 +
name = "r-efi"
988 +
version = "5.3.0"
989 +
source = "registry+https://github.com/rust-lang/crates.io-index"
990 +
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
991 +
992 +
[[package]]
993 +
name = "r-efi"
994 +
version = "6.0.0"
995 +
source = "registry+https://github.com/rust-lang/crates.io-index"
996 +
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
997 +
998 +
[[package]]
999 +
name = "radar"
1000 +
version = "0.1.0"
1001 +
dependencies = [
1002 +
 "spectra-core",
1003 +
]
1004 +
1005 +
[[package]]
1006 +
name = "rand"
1007 +
version = "0.8.8"
1008 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1009 +
checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c"
1010 +
dependencies = [
1011 +
 "libc",
1012 +
 "rand_chacha 0.3.1",
1013 +
 "rand_core 0.6.4",
1014 +
]
1015 +
1016 +
[[package]]
1017 +
name = "rand"
1018 +
version = "0.9.5"
1019 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1020 +
checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41"
1021 +
dependencies = [
1022 +
 "rand_chacha 0.9.0",
1023 +
 "rand_core 0.9.5",
1024 +
]
1025 +
1026 +
[[package]]
1027 +
name = "rand_chacha"
1028 +
version = "0.3.1"
1029 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1030 +
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
1031 +
dependencies = [
1032 +
 "ppv-lite86",
1033 +
 "rand_core 0.6.4",
1034 +
]
1035 +
1036 +
[[package]]
1037 +
name = "rand_chacha"
1038 +
version = "0.9.0"
1039 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1040 +
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
1041 +
dependencies = [
1042 +
 "ppv-lite86",
1043 +
 "rand_core 0.9.5",
1044 +
]
1045 +
1046 +
[[package]]
1047 +
name = "rand_core"
1048 +
version = "0.6.4"
1049 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1050 +
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1051 +
dependencies = [
1052 +
 "getrandom 0.2.17",
1053 +
]
1054 +
1055 +
[[package]]
1056 +
name = "rand_core"
1057 +
version = "0.9.5"
1058 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1059 +
checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
1060 +
dependencies = [
1061 +
 "getrandom 0.3.4",
1062 +
]
1063 +
1064 +
[[package]]
1065 +
name = "rand_core"
1066 +
version = "0.10.1"
1067 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1068 +
checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
1069 +
1070 +
[[package]]
1071 +
name = "rand_xorshift"
1072 +
version = "0.4.0"
1073 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1074 +
checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a"
1075 +
dependencies = [
1076 +
 "rand_core 0.9.5",
1077 +
]
1078 +
1079 +
[[package]]
1080 +
name = "rayon"
1081 +
version = "1.12.0"
1082 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1083 +
checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
1084 +
dependencies = [
1085 +
 "either",
1086 +
 "rayon-core",
1087 +
]
1088 +
1089 +
[[package]]
1090 +
name = "rayon-core"
1091 +
version = "1.13.0"
1092 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1093 +
checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
1094 +
dependencies = [
1095 +
 "crossbeam-deque",
1096 +
 "crossbeam-utils",
1097 +
]
1098 +
1099 +
[[package]]
1100 +
name = "regex-automata"
1101 +
version = "0.4.18"
1102 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1103 +
checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
1104 +
dependencies = [
1105 +
 "aho-corasick",
1106 +
 "memchr",
1107 +
 "regex-syntax",
1108 +
]
1109 +
1110 +
[[package]]
1111 +
name = "regex-syntax"
1112 +
version = "0.8.11"
1113 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1114 +
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
1115 +
1116 +
[[package]]
1117 +
name = "ring"
1118 +
version = "0.17.14"
1119 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1120 +
checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
1121 +
dependencies = [
1122 +
 "cc",
1123 +
 "cfg-if",
1124 +
 "getrandom 0.2.17",
1125 +
 "libc",
1126 +
 "untrusted",
1127 +
 "windows-sys 0.52.0",
1128 +
]
1129 +
1130 +
[[package]]
1131 +
name = "rustc_version"
1132 +
version = "0.4.1"
1133 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1134 +
checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
1135 +
dependencies = [
1136 +
 "semver",
1137 +
]
1138 +
1139 +
[[package]]
1140 +
name = "rustix"
1141 +
version = "1.1.5"
1142 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1143 +
checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d"
1144 +
dependencies = [
1145 +
 "bitflags",
1146 +
 "errno",
1147 +
 "libc",
1148 +
 "linux-raw-sys",
1149 +
 "windows-sys 0.52.0",
1150 +
]
1151 +
1152 +
[[package]]
1153 +
name = "rustls"
1154 +
version = "0.23.45"
1155 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1156 +
checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634"
1157 +
dependencies = [
1158 +
 "log",
1159 +
 "once_cell",
1160 +
 "ring",
1161 +
 "rustls-pki-types",
1162 +
 "rustls-webpki",
1163 +
 "subtle",
1164 +
 "zeroize",
1165 +
]
1166 +
1167 +
[[package]]
1168 +
name = "rustls-pemfile"
1169 +
version = "2.2.0"
1170 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1171 +
checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
1172 +
dependencies = [
1173 +
 "rustls-pki-types",
1174 +
]
1175 +
1176 +
[[package]]
1177 +
name = "rustls-pki-types"
1178 +
version = "1.15.1"
1179 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1180 +
checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96"
1181 +
dependencies = [
1182 +
 "zeroize",
1183 +
]
1184 +
1185 +
[[package]]
1186 +
name = "rustls-webpki"
1187 +
version = "0.103.15"
1188 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1189 +
checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2"
1190 +
dependencies = [
1191 +
 "ring",
1192 +
 "rustls-pki-types",
1193 +
 "untrusted",
1194 +
]
1195 +
1196 +
[[package]]
1197 +
name = "rustversion"
1198 +
version = "1.0.23"
1199 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1200 +
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
1201 +
1202 +
[[package]]
1203 +
name = "rusty-fork"
1204 +
version = "0.3.1"
1205 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1206 +
checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2"
1207 +
dependencies = [
1208 +
 "fnv",
1209 +
 "quick-error",
1210 +
 "tempfile",
1211 +
 "wait-timeout",
1212 +
]
1213 +
1214 +
[[package]]
1215 +
name = "same-file"
1216 +
version = "1.0.6"
1217 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1218 +
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
1219 +
dependencies = [
1220 +
 "winapi-util",
1221 +
]
1222 +
1223 +
[[package]]
1224 +
name = "semver"
1225 +
version = "1.0.28"
1226 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1227 +
checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
1228 +
1229 +
[[package]]
1230 +
name = "serde"
1231 +
version = "1.0.229"
1232 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1233 +
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
1234 +
dependencies = [
1235 +
 "serde_core",
1236 +
 "serde_derive",
1237 +
]
1238 +
1239 +
[[package]]
1240 +
name = "serde_core"
1241 +
version = "1.0.229"
1242 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1243 +
checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
1244 +
dependencies = [
1245 +
 "serde_derive",
1246 +
]
1247 +
1248 +
[[package]]
1249 +
name = "serde_derive"
1250 +
version = "1.0.229"
1251 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1252 +
checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
1253 +
dependencies = [
1254 +
 "proc-macro2",
1255 +
 "quote",
1256 +
 "syn 3.0.6",
1257 +
]
1258 +
1259 +
[[package]]
1260 +
name = "serde_json"
1261 +
version = "1.0.151"
1262 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1263 +
checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
1264 +
dependencies = [
1265 +
 "itoa",
1266 +
 "memchr",
1267 +
 "serde",
1268 +
 "serde_core",
1269 +
 "zmij",
1270 +
]
1271 +
1272 +
[[package]]
1273 +
name = "sha2"
1274 +
version = "0.11.0"
1275 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1276 +
checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4"
1277 +
dependencies = [
1278 +
 "cfg-if",
1279 +
 "cpufeatures",
1280 +
 "digest",
1281 +
]
1282 +
1283 +
[[package]]
1284 +
name = "shake"
1285 +
version = "0.1.0"
1286 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1287 +
checksum = "09057cb2149ad4cbd2da1e26b351f9a4c354219421229c69c3063e6f61947c4a"
1288 +
dependencies = [
1289 +
 "digest",
1290 +
 "keccak",
1291 +
 "sponge-cursor",
1292 +
]
1293 +
1294 +
[[package]]
1295 +
name = "shlex"
1296 +
version = "2.0.1"
1297 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1298 +
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
1299 +
1300 +
[[package]]
1301 +
name = "signal-hook-registry"
1302 +
version = "1.4.8"
1303 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1304 +
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
1305 +
dependencies = [
1306 +
 "errno",
1307 +
 "libc",
1308 +
]
1309 +
1310 +
[[package]]
1311 +
name = "signature"
1312 +
version = "3.0.0"
1313 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1314 +
checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5"
1315 +
dependencies = [
1316 +
 "digest",
1317 +
 "rand_core 0.10.1",
1318 +
]
1319 +
1320 +
[[package]]
1321 +
name = "simd-adler32"
1322 +
version = "0.3.10"
1323 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1324 +
checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
1325 +
1326 +
[[package]]
1327 +
name = "similar"
1328 +
version = "2.7.0"
1329 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1330 +
checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa"
1331 +
1332 +
[[package]]
1333 +
name = "slab"
1334 +
version = "0.4.12"
1335 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1336 +
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
1337 +
1338 +
[[package]]
1339 +
name = "smallvec"
1340 +
version = "1.16.2"
1341 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1342 +
checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e"
1343 +
1344 +
[[package]]
1345 +
name = "socket2"
1346 +
version = "0.6.5"
1347 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1348 +
checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
1349 +
dependencies = [
1350 +
 "libc",
1351 +
 "windows-sys 0.61.2",
1352 +
]
1353 +
1354 +
[[package]]
1355 +
name = "spectra"
1356 +
version = "0.1.0"
1357 +
dependencies = [
1358 +
 "anyhow",
1359 +
 "clap",
1360 +
 "console",
1361 +
 "indicatif",
1362 +
 "libc",
1363 +
 "mimalloc",
1364 +
 "oxy-core",
1365 +
 "radar",
1366 +
 "serde_json",
1367 +
 "spectra-api",
1368 +
 "spectra-core",
1369 +
 "spectra-mcp",
1370 +
 "tempfile",
1371 +
 "tokio",
1372 +
]
1373 +
1374 +
[[package]]
1375 +
name = "spectra-api"
1376 +
version = "0.1.0"
1377 +
dependencies = [
1378 +
 "serde",
1379 +
 "serde_json",
1380 +
]
1381 +
1382 +
[[package]]
1383 +
name = "spectra-core"
1384 +
version = "0.1.0"
1385 +
dependencies = [
1386 +
 "anyhow",
1387 +
 "oxy-core",
1388 +
 "serde",
1389 +
 "serde_json",
1390 +
 "thiserror 2.0.21",
1391 +
]
1392 +
1393 +
[[package]]
1394 +
name = "spectra-mcp"
1395 +
version = "0.1.0"
1396 +
dependencies = [
1397 +
 "serde_json",
1398 +
 "spectra-core",
1399 +
]
1400 +
1401 +
[[package]]
1402 +
name = "spki"
1403 +
version = "0.8.0"
1404 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1405 +
checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f"
1406 +
dependencies = [
1407 +
 "base64ct",
1408 +
 "der",
1409 +
]
1410 +
1411 +
[[package]]
1412 +
name = "sponge-cursor"
1413 +
version = "0.1.0"
1414 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1415 +
checksum = "3a0219bd7d979d58245a4f41f695e1ac9f8befdffadd7f61f1bae9e39abc6620"
1416 +
1417 +
[[package]]
1418 +
name = "stable_deref_trait"
1419 +
version = "1.2.1"
1420 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1421 +
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
1422 +
1423 +
[[package]]
1424 +
name = "strsim"
1425 +
version = "0.11.1"
1426 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1427 +
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
1428 +
1429 +
[[package]]
1430 +
name = "subtle"
1431 +
version = "2.6.1"
1432 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1433 +
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1434 +
1435 +
[[package]]
1436 +
name = "syn"
1437 +
version = "2.0.119"
1438 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1439 +
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
1440 +
dependencies = [
1441 +
 "proc-macro2",
1442 +
 "quote",
1443 +
 "unicode-ident",
1444 +
]
1445 +
1446 +
[[package]]
1447 +
name = "syn"
1448 +
version = "3.0.6"
1449 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1450 +
checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee"
1451 +
dependencies = [
1452 +
 "proc-macro2",
1453 +
 "quote",
1454 +
 "unicode-ident",
1455 +
]
1456 +
1457 +
[[package]]
1458 +
name = "synstructure"
1459 +
version = "0.14.0"
1460 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1461 +
checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02"
1462 +
dependencies = [
1463 +
 "proc-macro2",
1464 +
 "quote",
1465 +
 "syn 3.0.6",
1466 +
]
1467 +
1468 +
[[package]]
1469 +
name = "tempfile"
1470 +
version = "3.27.0"
1471 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1472 +
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
1473 +
dependencies = [
1474 +
 "fastrand",
1475 +
 "getrandom 0.4.3",
1476 +
 "once_cell",
1477 +
 "rustix",
1478 +
 "windows-sys 0.52.0",
1479 +
]
1480 +
1481 +
[[package]]
1482 +
name = "thiserror"
1483 +
version = "1.0.69"
1484 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1485 +
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
1486 +
dependencies = [
1487 +
 "thiserror-impl 1.0.69",
1488 +
]
1489 +
1490 +
[[package]]
1491 +
name = "thiserror"
1492 +
version = "2.0.21"
1493 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1494 +
checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
1495 +
dependencies = [
1496 +
 "thiserror-impl 2.0.21",
1497 +
]
1498 +
1499 +
[[package]]
1500 +
name = "thiserror-impl"
1501 +
version = "1.0.69"
1502 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1503 +
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
1504 +
dependencies = [
1505 +
 "proc-macro2",
1506 +
 "quote",
1507 +
 "syn 2.0.119",
1508 +
]
1509 +
1510 +
[[package]]
1511 +
name = "thiserror-impl"
1512 +
version = "2.0.21"
1513 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1514 +
checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
1515 +
dependencies = [
1516 +
 "proc-macro2",
1517 +
 "quote",
1518 +
 "syn 3.0.6",
1519 +
]
1520 +
1521 +
[[package]]
1522 +
name = "tinystr"
1523 +
version = "0.8.4"
1524 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1525 +
checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643"
1526 +
dependencies = [
1527 +
 "displaydoc",
1528 +
 "zerovec",
1529 +
]
1530 +
1531 +
[[package]]
1532 +
name = "tokio"
1533 +
version = "1.53.1"
1534 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1535 +
checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed"
1536 +
dependencies = [
1537 +
 "bytes",
1538 +
 "libc",
1539 +
 "mio",
1540 +
 "pin-project-lite",
1541 +
 "signal-hook-registry",
1542 +
 "socket2",
1543 +
 "tokio-macros",
1544 +
 "windows-sys 0.61.2",
1545 +
]
1546 +
1547 +
[[package]]
1548 +
name = "tokio-macros"
1549 +
version = "2.7.2"
1550 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1551 +
checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e"
1552 +
dependencies = [
1553 +
 "proc-macro2",
1554 +
 "quote",
1555 +
 "syn 3.0.6",
1556 +
]
1557 +
1558 +
[[package]]
1559 +
name = "typenum"
1560 +
version = "1.20.1"
1561 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1562 +
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
1563 +
1564 +
[[package]]
1565 +
name = "unarray"
1566 +
version = "0.1.4"
1567 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1568 +
checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94"
1569 +
1570 +
[[package]]
1571 +
name = "unicode-ident"
1572 +
version = "1.0.26"
1573 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1574 +
checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954"
1575 +
1576 +
[[package]]
1577 +
name = "unicode-width"
1578 +
version = "0.2.2"
1579 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1580 +
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
1581 +
1582 +
[[package]]
1583 +
name = "untrusted"
1584 +
version = "0.9.0"
1585 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1586 +
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
1587 +
1588 +
[[package]]
1589 +
name = "ureq"
1590 +
version = "2.12.1"
1591 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1592 +
checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d"
1593 +
dependencies = [
1594 +
 "base64",
1595 +
 "flate2",
1596 +
 "log",
1597 +
 "once_cell",
1598 +
 "rustls",
1599 +
 "rustls-pki-types",
1600 +
 "url",
1601 +
 "webpki-roots 0.26.11",
1602 +
]
1603 +
1604 +
[[package]]
1605 +
name = "url"
1606 +
version = "2.5.8"
1607 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1608 +
checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
1609 +
dependencies = [
1610 +
 "form_urlencoded",
1611 +
 "idna",
1612 +
 "percent-encoding",
1613 +
 "serde",
1614 +
]
1615 +
1616 +
[[package]]
1617 +
name = "utf8_iter"
1618 +
version = "1.0.4"
1619 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1620 +
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
1621 +
1622 +
[[package]]
1623 +
name = "utf8parse"
1624 +
version = "0.2.2"
1625 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1626 +
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
1627 +
1628 +
[[package]]
1629 +
name = "wait-timeout"
1630 +
version = "0.2.1"
1631 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1632 +
checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11"
1633 +
dependencies = [
1634 +
 "libc",
1635 +
]
1636 +
1637 +
[[package]]
1638 +
name = "walkdir"
1639 +
version = "2.5.0"
1640 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1641 +
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
1642 +
dependencies = [
1643 +
 "same-file",
1644 +
 "winapi-util",
1645 +
]
1646 +
1647 +
[[package]]
1648 +
name = "wasi"
1649 +
version = "0.11.1+wasi-snapshot-preview1"
1650 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1651 +
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
1652 +
1653 +
[[package]]
1654 +
name = "wasip2"
1655 +
version = "1.0.4+wasi-0.2.12"
1656 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1657 +
checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
1658 +
dependencies = [
1659 +
 "wit-bindgen",
1660 +
]
1661 +
1662 +
[[package]]
1663 +
name = "wasm-bindgen"
1664 +
version = "0.2.129"
1665 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1666 +
checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409"
1667 +
dependencies = [
1668 +
 "cfg-if",
1669 +
 "once_cell",
1670 +
 "rustversion",
1671 +
 "wasm-bindgen-macro",
1672 +
 "wasm-bindgen-shared",
1673 +
]
1674 +
1675 +
[[package]]
1676 +
name = "wasm-bindgen-macro"
1677 +
version = "0.2.129"
1678 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1679 +
checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535"
1680 +
dependencies = [
1681 +
 "quote",
1682 +
 "wasm-bindgen-macro-support",
1683 +
]
1684 +
1685 +
[[package]]
1686 +
name = "wasm-bindgen-macro-support"
1687 +
version = "0.2.129"
1688 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1689 +
checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7"
1690 +
dependencies = [
1691 +
 "bumpalo",
1692 +
 "proc-macro2",
1693 +
 "quote",
1694 +
 "syn 3.0.6",
1695 +
 "wasm-bindgen-shared",
1696 +
]
1697 +
1698 +
[[package]]
1699 +
name = "wasm-bindgen-shared"
1700 +
version = "0.2.129"
1701 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1702 +
checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6"
1703 +
dependencies = [
1704 +
 "unicode-ident",
1705 +
]
1706 +
1707 +
[[package]]
1708 +
name = "web-time"
1709 +
version = "1.1.0"
1710 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1711 +
checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
1712 +
dependencies = [
1713 +
 "js-sys",
1714 +
 "wasm-bindgen",
1715 +
]
1716 +
1717 +
[[package]]
1718 +
name = "webpki-roots"
1719 +
version = "0.26.11"
1720 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1721 +
checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
1722 +
dependencies = [
1723 +
 "webpki-roots 1.0.9",
1724 +
]
1725 +
1726 +
[[package]]
1727 +
name = "webpki-roots"
1728 +
version = "1.0.9"
1729 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1730 +
checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a"
1731 +
dependencies = [
1732 +
 "rustls-pki-types",
1733 +
]
1734 +
1735 +
[[package]]
1736 +
name = "winapi-util"
1737 +
version = "0.1.11"
1738 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1739 +
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
1740 +
dependencies = [
1741 +
 "windows-sys 0.52.0",
1742 +
]
1743 +
1744 +
[[package]]
1745 +
name = "windows-link"
1746 +
version = "0.2.1"
1747 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1748 +
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
1749 +
1750 +
[[package]]
1751 +
name = "windows-sys"
1752 +
version = "0.52.0"
1753 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1754 +
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
1755 +
dependencies = [
1756 +
 "windows-targets",
1757 +
]
1758 +
1759 +
[[package]]
1760 +
name = "windows-sys"
1761 +
version = "0.59.0"
1762 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1763 +
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
1764 +
dependencies = [
1765 +
 "windows-targets",
1766 +
]
1767 +
1768 +
[[package]]
1769 +
name = "windows-sys"
1770 +
version = "0.61.2"
1771 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1772 +
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
1773 +
dependencies = [
1774 +
 "windows-link",
1775 +
]
1776 +
1777 +
[[package]]
1778 +
name = "windows-targets"
1779 +
version = "0.52.6"
1780 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1781 +
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
1782 +
dependencies = [
1783 +
 "windows_aarch64_gnullvm",
1784 +
 "windows_aarch64_msvc",
1785 +
 "windows_i686_gnu",
1786 +
 "windows_i686_gnullvm",
1787 +
 "windows_i686_msvc",
1788 +
 "windows_x86_64_gnu",
1789 +
 "windows_x86_64_gnullvm",
1790 +
 "windows_x86_64_msvc",
1791 +
]
1792 +
1793 +
[[package]]
1794 +
name = "windows_aarch64_gnullvm"
1795 +
version = "0.52.6"
1796 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1797 +
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
1798 +
1799 +
[[package]]
1800 +
name = "windows_aarch64_msvc"
1801 +
version = "0.52.6"
1802 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1803 +
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
1804 +
1805 +
[[package]]
1806 +
name = "windows_i686_gnu"
1807 +
version = "0.52.6"
1808 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1809 +
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
1810 +
1811 +
[[package]]
1812 +
name = "windows_i686_gnullvm"
1813 +
version = "0.52.6"
1814 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1815 +
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
1816 +
1817 +
[[package]]
1818 +
name = "windows_i686_msvc"
1819 +
version = "0.52.6"
1820 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1821 +
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
1822 +
1823 +
[[package]]
1824 +
name = "windows_x86_64_gnu"
1825 +
version = "0.52.6"
1826 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1827 +
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
1828 +
1829 +
[[package]]
1830 +
name = "windows_x86_64_gnullvm"
1831 +
version = "0.52.6"
1832 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1833 +
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
1834 +
1835 +
[[package]]
1836 +
name = "windows_x86_64_msvc"
1837 +
version = "0.52.6"
1838 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1839 +
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
1840 +
1841 +
[[package]]
1842 +
name = "wit-bindgen"
1843 +
version = "0.57.1"
1844 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1845 +
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
1846 +
1847 +
[[package]]
1848 +
name = "writeable"
1849 +
version = "0.6.4"
1850 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1851 +
checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
1852 +
1853 +
[[package]]
1854 +
name = "yoke"
1855 +
version = "0.8.3"
1856 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1857 +
checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
1858 +
dependencies = [
1859 +
 "stable_deref_trait",
1860 +
 "yoke-derive",
1861 +
 "zerofrom",
1862 +
]
1863 +
1864 +
[[package]]
1865 +
name = "yoke-derive"
1866 +
version = "0.8.3"
1867 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1868 +
checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78"
1869 +
dependencies = [
1870 +
 "proc-macro2",
1871 +
 "quote",
1872 +
 "syn 3.0.6",
1873 +
 "synstructure",
1874 +
]
1875 +
1876 +
[[package]]
1877 +
name = "zerocopy"
1878 +
version = "0.8.59"
1879 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1880 +
checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb"
1881 +
dependencies = [
1882 +
 "zerocopy-derive",
1883 +
]
1884 +
1885 +
[[package]]
1886 +
name = "zerocopy-derive"
1887 +
version = "0.8.59"
1888 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1889 +
checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82"
1890 +
dependencies = [
1891 +
 "proc-macro2",
1892 +
 "quote",
1893 +
 "syn 2.0.119",
1894 +
]
1895 +
1896 +
[[package]]
1897 +
name = "zerofrom"
1898 +
version = "0.1.8"
1899 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1900 +
checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
1901 +
dependencies = [
1902 +
 "zerofrom-derive",
1903 +
]
1904 +
1905 +
[[package]]
1906 +
name = "zerofrom-derive"
1907 +
version = "0.1.8"
1908 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1909 +
checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a"
1910 +
dependencies = [
1911 +
 "proc-macro2",
1912 +
 "quote",
1913 +
 "syn 3.0.6",
1914 +
 "synstructure",
1915 +
]
1916 +
1917 +
[[package]]
1918 +
name = "zeroize"
1919 +
version = "1.9.0"
1920 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1921 +
checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
1922 +
1923 +
[[package]]
1924 +
name = "zerotrie"
1925 +
version = "0.2.5"
1926 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1927 +
checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f"
1928 +
dependencies = [
1929 +
 "displaydoc",
1930 +
 "yoke",
1931 +
 "zerofrom",
1932 +
]
1933 +
1934 +
[[package]]
1935 +
name = "zerovec"
1936 +
version = "0.11.8"
1937 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1938 +
checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8"
1939 +
dependencies = [
1940 +
 "yoke",
1941 +
 "zerofrom",
1942 +
 "zerovec-derive",
1943 +
]
1944 +
1945 +
[[package]]
1946 +
name = "zerovec-derive"
1947 +
version = "0.11.6"
1948 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1949 +
checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da"
1950 +
dependencies = [
1951 +
 "proc-macro2",
1952 +
 "quote",
1953 +
 "syn 3.0.6",
1954 +
]
1955 +
1956 +
[[package]]
1957 +
name = "zlib-rs"
1958 +
version = "0.6.8"
1959 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1960 +
checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112"
1961 +
1962 +
[[package]]
1963 +
name = "zmij"
1964 +
version = "1.0.23"
1965 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1966 +
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
1967 +
1968 +
[[package]]
1969 +
name = "zstd"
1970 +
version = "0.13.3"
1971 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1972 +
checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
1973 +
dependencies = [
1974 +
 "zstd-safe",
1975 +
]
1976 +
1977 +
[[package]]
1978 +
name = "zstd-safe"
1979 +
version = "7.3.0"
1980 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1981 +
checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882"
1982 +
dependencies = [
1983 +
 "zstd-sys",
1984 +
]
1985 +
1986 +
[[package]]
1987 +
name = "zstd-sys"
1988 +
version = "2.1.0+zstd.1.5.7"
1989 +
source = "registry+https://github.com/rust-lang/crates.io-index"
1990 +
checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0"
1991 +
dependencies = [
1992 +
 "cc",
1993 +
 "pkg-config",
1994 +
]
added Cargo.toml +79 −0
1 +
[workspace]
2 +
members = ["crates/spectra-core", "crates/spectra-mcp", "crates/spectra-api", "crates/radar", "."]
3 +
# The pinned Oxygen (deps/oxygen) is a workspace of its own.
4 +
exclude = ["deps"]
5 +
resolver = "2"
6 +
7 +
[workspace.package]
8 +
version = "0.1.0"
9 +
edition = "2021"
10 +
license = "MIT OR Apache-2.0"
11 +
12 +
[workspace.dependencies]
13 +
# Identities, delegation, composite signatures, deterministic CBOR and
14 +
# hashing are Oxygen's: Spectra links them from the pinned subrepo and never
15 +
# reimplements them (spec §7.3, §9.5).
16 +
oxy-core = { path = "deps/oxygen/crates/oxy-core" }
17 +
spectra-core = { path = "crates/spectra-core" }
18 +
spectra-mcp = { path = "crates/spectra-mcp" }
19 +
spectra-api = { path = "crates/spectra-api" }
20 +
radar = { path = "crates/radar" }
21 +
22 +
# Versions as oxygenhub's workspace has them, so the vendored OxygenFlow
23 +
# image builds Spectra too (spectra#2; `make deps-check`).
24 +
anyhow = "1"
25 +
thiserror = "2"
26 +
serde = { version = "1", features = ["derive"] }
27 +
serde_json = "1"
28 +
tokio = { version = "1", features = ["rt-multi-thread", "macros", "net", "sync", "time", "signal", "fs", "process", "io-util"] }
29 +
axum = { version = "0.8", features = ["macros", "form", "query"] }
30 +
tower-http = { version = "0.6", features = ["trace", "set-header", "limit"] }
31 +
askama = "0.14"
32 +
sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio", "sqlite", "migrate", "macros"] }
33 +
tracing = "0.1"
34 +
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
35 +
clap = { version = "4", features = ["derive", "env"] }
36 +
toml = "0.8"
37 +
pulldown-cmark = { version = "0.13", default-features = false, features = ["html"] }
38 +
ammonia = "4"
39 +
hex = "0.4"
40 +
rand = "0.8"
41 +
subtle = "2"
42 +
blake3 = "1"
43 +
tempfile = "3"
44 +
schemars = "1"
45 +
futures = "0.3"
46 +
tokio-stream = { version = "0.1", features = ["sync"] }
47 +
48 +
[package]
49 +
name = "spectra"
50 +
version.workspace = true
51 +
edition.workspace = true
52 +
license.workspace = true
53 +
description = "Spectra: a control plane for AI coding agents"
54 +
default-run = "spectra"
55 +
56 +
[[bin]]
57 +
name = "spectra"
58 +
path = "src/main.rs"
59 +
60 +
[dependencies]
61 +
spectra-core.workspace = true
62 +
spectra-mcp.workspace = true
63 +
spectra-api.workspace = true
64 +
radar.workspace = true
65 +
oxy-core.workspace = true
66 +
anyhow.workspace = true
67 +
clap.workspace = true
68 +
serde_json.workspace = true
69 +
tokio.workspace = true
70 +
console = "0.15"
71 +
indicatif = "0.17"
72 +
libc = "0.2"
73 +
mimalloc = { version = "0.1", default-features = false }
74 +
75 +
[dev-dependencies]
76 +
tempfile.workspace = true
77 +
78 +
[profile.release]
79 +
debug = 1
added LICENSE +30 −0
1 +
Spectra (spectra, spectra-core, spectra-mcp, spectra-api and radar) is licensed under either of
2 +
3 +
  * the MIT License (below), or
4 +
  * the Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
5 +
6 +
at your option.
7 +
8 +
---
9 +
10 +
MIT License
11 +
12 +
Copyright (c) 2026 Andy McCall
13 +
14 +
Permission is hereby granted, free of charge, to any person obtaining a copy
15 +
of this software and associated documentation files (the "Software"), to deal
16 +
in the Software without restriction, including without limitation the rights
17 +
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18 +
copies of the Software, and to permit persons to whom the Software is
19 +
furnished to do so, subject to the following conditions:
20 +
21 +
The above copyright notice and this permission notice shall be included in all
22 +
copies or substantial portions of the Software.
23 +
24 +
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 +
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 +
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 +
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 +
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29 +
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 +
SOFTWARE.
added Makefile +38 −0
1 +
.PHONY: build check test fmt clippy changelog run ts install deps-check
2 +
3 +
build:
4 +
	cargo build --release
5 +
6 +
check: changelog fmt clippy test
7 +
8 +
# A code change needs a CHANGELOG.md line (scripts/changelog-check.sh).
9 +
changelog:
10 +
	scripts/changelog-check.sh
11 +
12 +
fmt:
13 +
	cargo fmt -p spectra -p spectra-core -p spectra-mcp -p spectra-api -p radar -- --check
14 +
15 +
clippy:
16 +
	cargo clippy --workspace --all-targets -- -D warnings
17 +
18 +
test:
19 +
	cargo test --workspace
20 +
21 +
run:
22 +
	cargo run -- --data data serve
23 +
24 +
# TypeScript declarations of the API types, for the VS Code extensions.
25 +
ts:
26 +
	cargo run -q -p spectra-api --bin spectra-api-typescript > crates/spectra-api/ts/index.d.ts
27 +
28 +
# Build and install spectra with its build identity (oxy describe) in --version.
29 +
install:
30 +
	SPECTRA_BUILD="$$(oxy --plain describe 2>/dev/null)" CARGO_INCREMENTAL=0 cargo build --release
31 +
	ln -sf $${CARGO_TARGET_DIR:-$(CURDIR)/target}/release/spectra $(HOME)/.local/bin/spectra
32 +
	$(HOME)/.local/bin/spectra --version
33 +
34 +
# Every crate in Cargo.lock must be one the OxygenFlow build image vendors
35 +
# (oxygenflow images/rust: the crates of oxygen, oxygenhub and oxygenflow), or
36 +
# CI cannot build offline (spectra#2).
37 +
deps-check:
38 +
	scripts/deps-check.sh
added build.rs +24 −0
1 +
//! The build's identity, for `spectra --version`: `SPECTRA_BUILD` when a release or
2 +
//! an install sets it (from `oxy describe` in this checkout), else the heads a Flow job is
3 +
//! building, else "local build".
4 +
fn main() {
5 +
    println!("cargo:rerun-if-env-changed=SPECTRA_BUILD");
6 +
    // The heads name the build only when SPECTRA_BUILD does not: a CI job that
7 +
    // sets it stays fresh from one state to the next (oxygenflow#52).
8 +
    if !std::env::var("SPECTRA_BUILD").is_ok_and(|b| !b.trim().is_empty()) {
9 +
        println!("cargo:rerun-if-env-changed=FLOW_HEADS");
10 +
    }
11 +
    let build = std::env::var("SPECTRA_BUILD")
12 +
        .ok()
13 +
        .map(|b| b.trim().to_string())
14 +
        .filter(|b| !b.is_empty())
15 +
        .or_else(|| {
16 +
            std::env::var("FLOW_HEADS")
17 +
                .ok()
18 +
                .and_then(|h| h.split('+').next().map(|x| format!("flow #{}", &x[..12.min(x.len())])))
19 +
                .filter(|b| b.len() > "flow #".len())
20 +
        })
21 +
        .unwrap_or_else(|| "local build".into());
22 +
    println!("cargo:rustc-env=SPECTRA_BUILD_ID={build}");
23 +
    println!("cargo:rustc-env=SPECTRA_VERSION_LONG={} ({build})", std::env::var("CARGO_PKG_VERSION").unwrap());
24 +
}
added crates/radar/Cargo.toml +9 −0
1 +
[package]
2 +
name = "radar"
3 +
version.workspace = true
4 +
edition.workspace = true
5 +
license.workspace = true
6 +
description = "Radar: Spectra's web interface for the human"
7 +
8 +
[dependencies]
9 +
spectra-core.workspace = true
added crates/radar/src/lib.rs +3 −0
1 +
//! Radar (spec §17): the human's pages, rendered with askama, live over the
2 +
//! event stream, working without JavaScript. Linked by `spectra` and, later,
3 +
//! mounted by SpectraHub.
added crates/spectra-api/Cargo.toml +10 −0
1 +
[package]
2 +
name = "spectra-api"
3 +
version.workspace = true
4 +
edition.workspace = true
5 +
license.workspace = true
6 +
description = "Spectra's JSON API types, shared with SpectraHub and the extensions"
7 +
8 +
[dependencies]
9 +
serde.workspace = true
10 +
serde_json.workspace = true
added crates/spectra-api/src/lib.rs +3 −0
1 +
//! The JSON API's types (spec §18), with serde and JSON Schema derives, as
2 +
//! `hub-api` is for OxygenHub. `make ts` writes `ts/index.d.ts` from them for
3 +
//! spectra-vscode and spectrahub-vscode.
added crates/spectra-core/Cargo.toml +13 −0
1 +
[package]
2 +
name = "spectra-core"
3 +
version.workspace = true
4 +
edition.workspace = true
5 +
license.workspace = true
6 +
description = "Spectra's model: the ledger, projections, principals and the bus"
7 +
8 +
[dependencies]
9 +
oxy-core.workspace = true
10 +
anyhow.workspace = true
11 +
thiserror.workspace = true
12 +
serde.workspace = true
13 +
serde_json.workspace = true
added crates/spectra-core/src/lib.rs +10 −0
1 +
//! Spectra's model (spec §7.3): the ledger and its projections, principals
2 +
//! and their identities, the bus, rules and search. No HTTP, no CLI: those
3 +
//! are `spectra-mcp`, `radar` and the `spectra` binary, all built on this.
4 +
//!
5 +
//! Identities, delegation, composite signatures, deterministic CBOR and
6 +
//! hashing come from `oxy-core`; nothing here reimplements them.
7 +
8 +
/// The ledger's format version: the frozen event envelope (spec §9.1). A
9 +
/// database written with a newer format is refused, never guessed at.
10 +
pub const LEDGER_FORMAT: u32 = 1;
added crates/spectra-mcp/Cargo.toml +10 −0
1 +
[package]
2 +
name = "spectra-mcp"
3 +
version.workspace = true
4 +
edition.workspace = true
5 +
license.workspace = true
6 +
description = "Tuner: Spectra's MCP server over Streamable HTTP and the stdio shim"
7 +
8 +
[dependencies]
9 +
spectra-core.workspace = true
10 +
serde_json.workspace = true
added crates/spectra-mcp/src/lib.rs +5 −0
1 +
//! Tuner (spec §15): the MCP endpoint, its tools, resources and prompts, and
2 +
//! the stdio shim that signs an agent's requests and forwards them.
3 +
4 +
/// The MCP revisions Tuner speaks, newest first (spec §15.1).
5 +
pub const PROTOCOL_VERSIONS: &[&str] = &["2026-07-28", "2025-11-25", "2025-06-18", "2025-03-26"];
added deps/oxygen +0 −0

No line changes.

added docs/plan.md +32 −0
1 +
# Sprint 1 plan: Spectra 0.1, Talk
2 +
3 +
Each loop iteration: pick the first unchecked item, implement it with tests, run the gated checks, commit with `oxy`, tick the box here with a one-line note, and commit again. Update `docs/spec.md` (and its changelog) whenever behaviour the spec describes changes. If an item cannot be finished in two iterations, note why under it and move on. The issues are on https://oxygenhub.io/projects/andymccall/7.
4 +
5 +
## Rules
6 +
7 +
- Never run `git init` in this directory or push this project anywhere but its `oxygenhub` remote. Commit with `OXY_HOME=~/.oxy-agents/claude oxy commit -m "..." PATHS..`, never with Andy's own key.
8 +
- Tests are hermetic: a temporary data directory, a temporary socket, port 0; never `~/.local/share/spectra`, `~/.config` or the network.
9 +
- Gate every commit on `make check` (changelog, fmt, clippy with warnings as errors, tests).
10 +
- Every code change adds a CHANGELOG.md line under `## Unreleased`, or sets `NO_CHANGELOG=1`.
11 +
- Never weaken a security goal of spec §5 to make a test pass.
12 +
- Never act as Andy: owner-only steps (delegating to an agent key, the acceptance run) wait for him.
13 +
14 +
## Items
15 +
16 +
- [ ] #1 Project skeleton in Oxygen's shape
17 +
- [ ] #2 CI on OxygenFlow
18 +
- [ ] #3 The ledger
19 +
- [ ] #4 Identities instead of tokens
20 +
- [ ] #5 Projects, presence and sessions
21 +
- [ ] #6 Channels, threads, messages, inbox and search
22 +
- [ ] #7 Tuner: MCP over Streamable HTTP
23 +
- [ ] #8 The 0.1 tools
24 +
- [ ] #9 The stdio shim
25 +
- [ ] #10 Radar
26 +
- [ ] #11 JSON API and spectra-api types
27 +
- [ ] #12 Human CLI
28 +
- [ ] #13 Acceptance (with Andy)
29 +
30 +
## Log
31 +
32 +
- 2026-11-02 plan created; sprint adjusted to spec Draft 0.3 (identities and the ledger).
added rustfmt.toml +2 −0
1 +
max_width = 140
2 +
use_small_heuristics = "Max"
added scripts/changelog-check.sh +27 −0
1 +
#!/bin/sh
2 +
# The changelog check (2026-10-19): a commit that changes what users get
3 +
# adds a line under "## Unreleased" in CHANGELOG.md, so a release's notes
4 +
# are written as the work is done and versions say what changed.
5 +
#
6 +
#   scripts/changelog-check.sh [PATH...]
7 +
#
8 +
# PATHs are what the commit will take (as given to `oxy commit`); without
9 +
# any, the working copy's changes. Code is anything under src/, crates/,
10 +
# templates/, assets/, packaging/, images/ or scripts/, except tests.
11 +
# Docs, pipelines, pins (deps/) and lock files need no line. For a code
12 +
# change users won't notice (a refactor, a test helper), set NO_CHANGELOG=1.
13 +
set -eu
14 +
[ "${NO_CHANGELOG:-}" = 1 ] && exit 0
15 +
cd "$(dirname "$0")/.."
16 +
if [ "$#" -gt 0 ]; then
17 +
    paths=$(printf '%s\n' "$@")
18 +
else
19 +
    paths=$(oxy --plain status --json | python3 -c 'import json,sys; print("\n".join(p["path"] for p in json.load(sys.stdin)["paths"]))')
20 +
fi
21 +
code=$(printf '%s\n' "$paths" | grep -E '^(src|crates|templates|assets|packaging|images|scripts)/' | grep -vE '(^|/)tests?/|_test\.rs$' || true)
22 +
[ -z "$code" ] && exit 0
23 +
printf '%s\n' "$paths" | grep -qx 'CHANGELOG.md' && exit 0
24 +
echo "changelog: these changes touch code but CHANGELOG.md has no new line under ## Unreleased:" >&2
25 +
printf '%s\n' "$code" | sed 's/^/  /' >&2
26 +
echo "add one (Added / Changed / Fixed / Security, with the issue number), or set NO_CHANGELOG=1 if users won't notice" >&2
27 +
exit 1
added scripts/deps-check.sh +22 −0
1 +
#!/bin/sh
2 +
# Every package in Spectra's Cargo.lock must be in one of the lockfiles the
3 +
# OxygenFlow build image vendors (oxygen, oxygenhub, oxygenflow), at the same
4 +
# version, or Flow jobs, which have no network, fail with "no matching
5 +
# package" (spectra#2). The other projects are found beside this one, or
6 +
# under DEV (default: ..).
7 +
#
8 +
#   scripts/deps-check.sh
9 +
set -eu
10 +
cd "$(dirname "$0")/.."
11 +
dev=${DEV:-..}
12 +
pkgs() { awk '/^\[\[package\]\]/{n="";v="";s=0} /^name = /{n=$3} /^version = /{v=$3} /^source = /{s=1; print n" "v}' "$@" | tr -d '"' | sort -u; }
13 +
have=$(pkgs "$dev/oxygen/Cargo.lock" "$dev/oxygenhub/Cargo.lock" "$dev/oxygenflow/Cargo.lock")
14 +
need=$(pkgs Cargo.lock)
15 +
missing=$(printf '%s\n' "$need" | grep -vxF "$have" || true)
16 +
if [ -n "$missing" ]; then
17 +
    echo "deps-check: these crates are not in the OxygenFlow image's vendored set:" >&2
18 +
    printf '%s\n' "$missing" | sed 's/^/  /' >&2
19 +
    echo "pin a version the image has (cargo update -p NAME --precise V), or rebuild the image with Spectra's workspace" >&2
20 +
    exit 1
21 +
fi
22 +
echo "deps-check: all $(printf '%s\n' "$need" | wc -l) crates are vendored in the image"
added src/cli/format.rs +19 −0
1 +
//! Times as `oxy` prints them: UTC, `YYYY-MM-DD HH:MM:SSZ`.
2 +
3 +
pub fn when(ms: u64) -> String {
4 +
    let secs = (ms / 1000) as i64;
5 +
    let days = secs.div_euclid(86_400);
6 +
    let rem = secs.rem_euclid(86_400);
7 +
    // Civil-from-days (Howard Hinnant), UTC.
8 +
    let z = days + 719_468;
9 +
    let era = z.div_euclid(146_097);
10 +
    let doe = z - era * 146_097;
11 +
    let yoe = (doe - doe / 1460 + doe / 36_524 - doe / 146_096) / 365;
12 +
    let y = yoe + era * 400;
13 +
    let doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
14 +
    let mp = (5 * doy + 2) / 153;
15 +
    let d = doy - (153 * mp + 2) / 5 + 1;
16 +
    let m = if mp < 10 { mp + 3 } else { mp - 9 };
17 +
    let y = if m <= 2 { y + 1 } else { y };
18 +
    format!("{y:04}-{m:02}-{d:02} {:02}:{:02}:{:02}Z", rem / 3600, (rem % 3600) / 60, rem % 60)
19 +
}
added src/cli/json.rs +25 −0
1 +
#![allow(dead_code)] // Shared with oxy: not every helper is used yet.
2 +
//! Tiny JSON building for `--json` outputs: one document on stdout,
3 +
//! nothing else, with string escaping shared with the hooks payloads.
4 +
5 +
pub use oxy_core::repo::{json_array as arr, json_str as s};
6 +
7 +
pub fn obj<I: IntoIterator<Item = (&'static str, String)>>(pairs: I) -> String {
8 +
    let inner: Vec<String> = pairs.into_iter().map(|(k, v)| format!("{}:{v}", s(k))).collect();
9 +
    format!("{{{}}}", inner.join(","))
10 +
}
11 +
pub fn b(v: bool) -> String {
12 +
    v.to_string()
13 +
}
14 +
pub fn n<T: std::fmt::Display>(v: T) -> String {
15 +
    v.to_string()
16 +
}
17 +
pub fn opt<T>(v: Option<T>, f: impl Fn(T) -> String) -> String {
18 +
    match v {
19 +
        Some(x) => f(x),
20 +
        None => "null".into(),
21 +
    }
22 +
}
23 +
pub fn hashes(v: &[oxy_core::hash::ChangeHash]) -> String {
24 +
    arr(v.iter().map(|h| s(&h.to_hex())))
25 +
}
added src/cli/mod.rs +55 −0
1 +
//! The `spectra` command line (spec §19). Output follows `oxy`: colour and
2 +
//! glyphs on a UTF-8 terminal, plain when piped, with `--plain` or with
3 +
//! `NO_COLOR`; `--json` prints one document on stdout and nothing else.
4 +
5 +
pub mod format;
6 +
pub mod json;
7 +
pub mod ui;
8 +
9 +
use anyhow::Result;
10 +
use clap::{Parser, Subcommand};
11 +
12 +
#[derive(Parser)]
13 +
#[command(name = "spectra", version = env!("SPECTRA_VERSION_LONG"), about = "A control plane for AI coding agents")]
14 +
pub struct Cli {
15 +
    /// Plain output: no colour or glyphs (also NO_COLOR, or when not a terminal)
16 +
    #[arg(long, global = true)]
17 +
    pub plain: bool,
18 +
    #[command(subcommand)]
19 +
    pub command: Command,
20 +
}
21 +
22 +
#[derive(Subcommand)]
23 +
pub enum Command {
24 +
    /// The version and build of this binary
25 +
    Version {
26 +
        /// Machine-readable output
27 +
        #[arg(long)]
28 +
        json: bool,
29 +
    },
30 +
}
31 +
32 +
pub fn run() -> Result<i32> {
33 +
    let cli = Cli::parse();
34 +
    ui::init(cli.plain);
35 +
    match cli.command {
36 +
        Command::Version { json } => version(json),
37 +
    }
38 +
}
39 +
40 +
fn version(as_json: bool) -> Result<i32> {
41 +
    if as_json {
42 +
        println!(
43 +
            "{}",
44 +
            serde_json::json!({
45 +
                "version": env!("CARGO_PKG_VERSION"),
46 +
                "build": env!("SPECTRA_BUILD_ID"),
47 +
                "mcp_protocol_versions": spectra_mcp::PROTOCOL_VERSIONS,
48 +
                "ledger_format": spectra_core::LEDGER_FORMAT,
49 +
            })
50 +
        );
51 +
    } else {
52 +
        println!("spectra {}", env!("SPECTRA_VERSION_LONG"));
53 +
    }
54 +
    Ok(0)
55 +
}
added src/cli/ui.rs +245 −0
1 +
#![allow(dead_code)] // Shared with oxy: not every helper is used yet.
2 +
//! Terminal presentation: colour, emphasis, and a live spinner while a
3 +
//! command works. Everything degrades to plain text when stdout is not a
4 +
//! terminal, when `NO_COLOR` is set, or with `--plain`.
5 +
6 +
use console::{style, StyledObject, Term};
7 +
use indicatif::{ProgressBar, ProgressStyle};
8 +
use std::sync::atomic::{AtomicBool, Ordering};
9 +
use std::time::Duration;
10 +
11 +
static PLAIN: AtomicBool = AtomicBool::new(false);
12 +
static UNICODE: AtomicBool = AtomicBool::new(false);
13 +
static INIT: std::sync::Once = std::sync::Once::new();
14 +
15 +
/// Decide once whether to use colour, glyphs, and animation.
16 +
pub fn init(plain_flag: bool) {
17 +
    INIT.call_once(|| {
18 +
        let no_color = std::env::var_os("NO_COLOR").is_some();
19 +
        let tty = Term::stdout().features().is_attended();
20 +
        let plain = plain_flag || no_color || !tty;
21 +
        PLAIN.store(plain, Ordering::Relaxed);
22 +
        console::set_colors_enabled(!plain);
23 +
        let utf8 = ["LC_ALL", "LC_CTYPE", "LANG"]
24 +
            .iter()
25 +
            .filter_map(|k| std::env::var(k).ok())
26 +
            .find(|v| !v.is_empty())
27 +
            .map(|v| v.to_ascii_uppercase().contains("UTF-8") || v.to_ascii_uppercase().contains("UTF8"))
28 +
            .unwrap_or(false);
29 +
        UNICODE.store(!plain && utf8, Ordering::Relaxed);
30 +
    });
31 +
}
32 +
33 +
pub fn plain() -> bool {
34 +
    PLAIN.load(Ordering::Relaxed)
35 +
}
36 +
37 +
/// Whether the terminal takes Unicode glyphs (a UTF-8 locale, not `--plain`).
38 +
pub fn unicode() -> bool {
39 +
    UNICODE.load(Ordering::Relaxed)
40 +
}
41 +
42 +
/// A glyph with an ASCII fallback for plain output and non-UTF-8 locales.
43 +
pub fn glyph<'a>(fancy: &'a str, ascii: &'a str) -> &'a str {
44 +
    if unicode() {
45 +
        fancy
46 +
    } else {
47 +
        ascii
48 +
    }
49 +
}
50 +
51 +
/// A finished action: a tick and the verb in green.
52 +
pub fn done<T: std::fmt::Display>(v: T) -> String {
53 +
    format!("{} {}", ok(glyph("✔", "*")), ok(v))
54 +
}
55 +
56 +
/// A warning line prefix.
57 +
pub fn caution() -> String {
58 +
    warn(glyph("⚠", "!"))
59 +
}
60 +
61 +
/// An informational note prefix.
62 +
pub fn note() -> String {
63 +
    dim(glyph("›", ">"))
64 +
}
65 +
66 +
/// A section title.
67 +
pub fn section<T: std::fmt::Display>(v: T) -> String {
68 +
    format!("{} {}", s(glyph("▍", "#")).cyan(), s(v).bold())
69 +
}
70 +
71 +
/// `  key   value`, with the key dimmed and padded.
72 +
pub fn kv<T: std::fmt::Display>(key: &str, value: T) -> String {
73 +
    format!("  {} {value}", dim(format!("{key:<8}")))
74 +
}
75 +
76 +
/// An author name.
77 +
pub fn author<T: std::fmt::Display>(v: T) -> String {
78 +
    s(v).magenta().to_string()
79 +
}
80 +
81 +
/// A bookmark or reference name.
82 +
pub fn bookmark<T: std::fmt::Display>(v: T) -> String {
83 +
    s(v).green().bold().to_string()
84 +
}
85 +
86 +
/// The subject line of a message.
87 +
pub fn subject<T: std::fmt::Display>(v: T) -> String {
88 +
    s(v).bold().to_string()
89 +
}
90 +
91 +
/// A dimmed separator between the parts of a metadata line.
92 +
pub fn sep() -> String {
93 +
    dim(format!(" {} ", glyph("·", "-")))
94 +
}
95 +
96 +
/// Milliseconds since the epoch as a relative time ("3 minutes ago"), or the
97 +
/// date when older than a month.
98 +
pub fn ago(ms: u64) -> String {
99 +
    let now = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).map(|d| d.as_millis() as u64).unwrap_or(0);
100 +
    let secs = now.saturating_sub(ms) / 1000;
101 +
    let unit = |n: u64, w: &str| format!("{n} {w}{} ago", if n == 1 { "" } else { "s" });
102 +
    match secs {
103 +
        0..=44 => "just now".into(),
104 +
        45..=89 => "a minute ago".into(),
105 +
        90..=2_699 => unit(secs.div_ceil(60), "minute"),
106 +
        2_700..=5_399 => "an hour ago".into(),
107 +
        5_400..=79_199 => unit(secs.div_ceil(3_600), "hour"),
108 +
        79_200..=129_599 => "yesterday".into(),
109 +
        129_600..=2_591_999 => unit(secs.div_ceil(86_400), "day"),
110 +
        _ => super::format::when(ms).split(' ').next().unwrap_or("").to_string(),
111 +
    }
112 +
}
113 +
114 +
/// The bullet for a log entry: the working copy, a head, or an ordinary change.
115 +
pub fn log_bullet(working_copy: bool, head: bool, conflicted: bool) -> String {
116 +
    if working_copy {
117 +
        s(glyph("◉", "@")).cyan().bold().to_string()
118 +
    } else if conflicted {
119 +
        err(glyph("✱", "!"))
120 +
    } else if head {
121 +
        ok(glyph("●", "*"))
122 +
    } else {
123 +
        dim(glyph("○", "o"))
124 +
    }
125 +
}
126 +
127 +
/// A status glyph and word for a working-copy change.
128 +
pub fn status_mark(tag: &str) -> String {
129 +
    let (g, a, word) = match tag {
130 +
        "A" => ("✚", "+", "added"),
131 +
        "M" => ("✎", "~", "modified"),
132 +
        "D" => ("✖", "-", "removed"),
133 +
        "X" => ("⚙", "x", "mode"),
134 +
        "C!" => ("‼", "!", "markers"),
135 +
        "R" => ("➜", ">", "renamed"),
136 +
        "V" => ("✔", "r", "resolved"),
137 +
        _ => ("?", "?", "unknown"),
138 +
    };
139 +
    let text = format!("{} {word:<9}", glyph(g, a));
140 +
    self::tag_style(tag, &text)
141 +
}
142 +
143 +
fn tag_style(t: &str, text: &str) -> String {
144 +
    match t {
145 +
        "A" | "V" => s(text).green().to_string(),
146 +
        "R" => s(text).cyan().to_string(),
147 +
        "M" | "X" => s(text).yellow().to_string(),
148 +
        "D" | "C!" => s(text).red().to_string(),
149 +
        _ => text.to_string(),
150 +
    }
151 +
}
152 +
153 +
fn s<T: std::fmt::Display>(v: T) -> StyledObject<T> {
154 +
    style(v)
155 +
}
156 +
157 +
/// A ChangeId prefix.
158 +
pub fn id<T: std::fmt::Display>(v: T) -> String {
159 +
    s(v).cyan().bold().to_string()
160 +
}
161 +
/// A hash prefix.
162 +
pub fn hash<T: std::fmt::Display>(v: T) -> String {
163 +
    s(v).dim().to_string()
164 +
}
165 +
pub fn path<T: std::fmt::Display>(v: T) -> String {
166 +
    s(v).bold().to_string()
167 +
}
168 +
pub fn ok<T: std::fmt::Display>(v: T) -> String {
169 +
    s(v).green().to_string()
170 +
}
171 +
pub fn warn<T: std::fmt::Display>(v: T) -> String {
172 +
    s(v).yellow().to_string()
173 +
}
174 +
pub fn err<T: std::fmt::Display>(v: T) -> String {
175 +
    s(v).red().bold().to_string()
176 +
}
177 +
pub fn dim<T: std::fmt::Display>(v: T) -> String {
178 +
    s(v).dim().to_string()
179 +
}
180 +
pub fn heading<T: std::fmt::Display>(v: T) -> String {
181 +
    s(v).bold().underlined().to_string()
182 +
}
183 +
/// A live spinner with a message, shown only on a terminal. Drop or call
184 +
/// `done` to clear it; `done` prints the final line in its place.
185 +
pub struct Spinner {
186 +
    bar: Option<ProgressBar>,
187 +
}
188 +
189 +
pub fn spinner(msg: &str) -> Spinner {
190 +
    if plain() {
191 +
        return Spinner { bar: None };
192 +
    }
193 +
    let bar = ProgressBar::new_spinner();
194 +
    bar.set_style(
195 +
        ProgressStyle::with_template("{spinner:.cyan} {msg}")
196 +
            .unwrap()
197 +
            .tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏", " "]),
198 +
    );
199 +
    bar.set_message(msg.to_string());
200 +
    bar.enable_steady_tick(Duration::from_millis(80));
201 +
    Spinner { bar: Some(bar) }
202 +
}
203 +
204 +
impl Spinner {
205 +
    /// Replace the spinner with a final line (or print it plainly). The
206 +
    /// line is printed as given: callers start it with their own mark.
207 +
    pub fn done(self, msg: &str) {
208 +
        if let Some(b) = &self.bar {
209 +
            b.finish_and_clear();
210 +
        }
211 +
        println!("{msg}");
212 +
    }
213 +
    /// Say what is happening now: the spinner's message, or, with no
214 +
    /// terminal, a line on stderr, so a long command is never silent.
215 +
    pub fn set(&self, msg: &str) {
216 +
        match &self.bar {
217 +
            Some(b) => b.set_message(msg.to_string()),
218 +
            None => eprintln!("{} {msg}", dim(glyph("›", ">"))),
219 +
        }
220 +
    }
221 +
    /// Clear the spinner without printing.
222 +
    pub fn clear(self) {
223 +
        if let Some(b) = &self.bar {
224 +
            b.finish_and_clear();
225 +
        }
226 +
    }
227 +
}
228 +
229 +
#[cfg(test)]
230 +
mod tests {
231 +
    use super::*;
232 +
233 +
    #[test]
234 +
    fn relative_times() {
235 +
        let now = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_millis() as u64;
236 +
        assert_eq!(ago(now), "just now");
237 +
        assert_eq!(ago(now - 60_000), "a minute ago");
238 +
        assert_eq!(ago(now - 5 * 60_000), "5 minutes ago");
239 +
        assert_eq!(ago(now - 3 * 3_600_000), "3 hours ago");
240 +
        assert_eq!(ago(now - 25 * 3_600_000), "yesterday");
241 +
        assert_eq!(ago(now - 4 * 86_400_000), "4 days ago");
242 +
        assert_eq!(ago(0), "1970-01-01");
243 +
        assert_eq!(glyph("✔", "*"), if unicode() { "✔" } else { "*" });
244 +
    }
245 +
}
added src/main.rs +28 −0
1 +
//! `spectra`: the control plane for AI coding agents.
2 +
//!
3 +
//! Command definitions and dispatch live in `cli`; each command group has
4 +
//! its own module there, as in `oxy`.
5 +
6 +
mod cli;
7 +
8 +
// Many small allocations from every thread (events, JSON, templates): mimalloc
9 +
// serves them from per-thread pages without the arena locks of glibc's.
10 +
#[global_allocator]
11 +
static ALLOC: mimalloc::MiMalloc = mimalloc::MiMalloc;
12 +
13 +
fn main() {
14 +
    // Behave like other CLI tools when output is piped into `head`: die
15 +
    // quietly on SIGPIPE instead of panicking on a failed write.
16 +
    #[cfg(unix)]
17 +
    unsafe {
18 +
        libc::signal(libc::SIGPIPE, libc::SIG_DFL);
19 +
    }
20 +
    match cli::run() {
21 +
        Ok(code) => std::process::exit(code),
22 +
        Err(e) => {
23 +
            cli::ui::init(false);
24 +
            eprintln!("{} {e:#}", cli::ui::err("error:"));
25 +
            std::process::exit(1);
26 +
        }
27 +
    }
28 +
}