@starlove/orbit 1.4.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/Dockerfile +10 -8
  2. package/README.md +146 -164
  3. package/dist/full/csp.txt +1 -0
  4. package/dist/full/fonts/JetBrains_Mono/JetBrainsMono-subset.woff2 +0 -0
  5. package/dist/full/fonts/JetBrains_Mono/README.txt +5 -0
  6. package/dist/full/fonts/Mona_Sans/MonaSans-subset.woff2 +0 -0
  7. package/{public/fonts/Open_Sans → dist/full/fonts/Mona_Sans}/OFL.txt +93 -93
  8. package/dist/full/fonts/Mona_Sans/README.txt +10 -0
  9. package/{public/fonts/JetBrains_Mono → dist/full/fonts/Newsreader}/OFL.txt +93 -93
  10. package/dist/full/fonts/Newsreader/README.txt +8 -0
  11. package/dist/full/fonts/Newsreader/newsreader.woff2 +0 -0
  12. package/dist/full/index.html +36 -653
  13. package/dist/full/js/app.BmuponPJ.js +32 -0
  14. package/dist/full/js/app.BmuponPJ.js.map +1 -0
  15. package/dist/full/js/chunk.1fJGQGbW.js +2 -0
  16. package/dist/full/js/chunk.1fJGQGbW.js.map +1 -0
  17. package/dist/full/js/chunk.5D7JO2zp.js +2 -0
  18. package/dist/full/js/chunk.5D7JO2zp.js.map +1 -0
  19. package/dist/full/js/chunk.BrNn_D79.js +2 -0
  20. package/dist/full/js/chunk.BrNn_D79.js.map +1 -0
  21. package/dist/full/js/chunk.CokJXIqM.js +2 -0
  22. package/dist/full/js/chunk.CokJXIqM.js.map +1 -0
  23. package/dist/full/js/chunk.D_Haqy6R.js +2 -0
  24. package/dist/full/js/chunk.D_Haqy6R.js.map +1 -0
  25. package/dist/full/js/chunk.RO0jsH6I.js +15 -0
  26. package/dist/full/js/chunk.RO0jsH6I.js.map +1 -0
  27. package/dist/full/js/chunk.dqWOEtBM.js +2 -0
  28. package/dist/full/js/chunk.dqWOEtBM.js.map +1 -0
  29. package/dist/full/js/warm.f260bbbc.js +15 -0
  30. package/dist/full/orbits-favicon.png +0 -0
  31. package/dist/full/orbits-logo-bg-wide.png +0 -0
  32. package/dist/full/orbits-logo-bg.png +0 -0
  33. package/dist/full/orbits-logo.png +0 -0
  34. package/dist/full/styles.2b154ffe.css +1 -0
  35. package/dist/full/vendor/starlove-ui/theme-init.js +66 -0
  36. package/dist/full/version.json +2 -2
  37. package/docs/AGENT_GUIDE.md +114 -0
  38. package/docs/UPDATING.md +249 -64
  39. package/lib/adapters/indexeddb/blobs.d.ts +3 -0
  40. package/lib/adapters/indexeddb/blobs.js +54 -0
  41. package/lib/adapters/indexeddb/database.d.ts +60 -0
  42. package/lib/adapters/indexeddb/database.js +126 -0
  43. package/lib/adapters/indexeddb/index.d.ts +5 -0
  44. package/lib/adapters/indexeddb/index.js +3 -0
  45. package/lib/adapters/indexeddb/locks.d.ts +14 -0
  46. package/lib/adapters/indexeddb/locks.js +40 -0
  47. package/lib/adapters/indexeddb/store.d.ts +40 -0
  48. package/lib/adapters/indexeddb/store.js +424 -0
  49. package/lib/adapters/indexeddb/tables.d.ts +43 -0
  50. package/lib/adapters/indexeddb/tables.js +127 -0
  51. package/lib/adapters/memory/blobs.d.ts +3 -0
  52. package/lib/adapters/memory/blobs.js +44 -0
  53. package/lib/adapters/memory/board.d.ts +41 -0
  54. package/lib/adapters/memory/board.js +521 -0
  55. package/lib/adapters/memory/index.d.ts +2 -0
  56. package/lib/adapters/memory/index.js +2 -0
  57. package/lib/adapters/memory/search.d.ts +6 -0
  58. package/lib/adapters/memory/search.js +30 -0
  59. package/lib/adapters/memory/store.d.ts +34 -0
  60. package/lib/adapters/memory/store.js +266 -0
  61. package/lib/adapters/sqlite/backups.d.ts +53 -0
  62. package/lib/adapters/sqlite/backups.js +232 -0
  63. package/lib/adapters/sqlite/blobs.d.ts +14 -0
  64. package/lib/adapters/sqlite/blobs.js +109 -0
  65. package/lib/adapters/sqlite/board.d.ts +77 -0
  66. package/lib/adapters/sqlite/board.js +328 -0
  67. package/lib/adapters/sqlite/database.d.ts +67 -0
  68. package/lib/adapters/sqlite/database.js +285 -0
  69. package/lib/adapters/sqlite/index.d.ts +3 -0
  70. package/lib/adapters/sqlite/index.js +2 -0
  71. package/lib/adapters/sqlite/lock.d.ts +11 -0
  72. package/lib/adapters/sqlite/lock.js +34 -0
  73. package/lib/adapters/sqlite/records.d.ts +54 -0
  74. package/lib/adapters/sqlite/records.js +546 -0
  75. package/lib/adapters/sqlite/schema.d.ts +54 -0
  76. package/lib/adapters/sqlite/schema.js +276 -0
  77. package/lib/adapters/sqlite/store.d.ts +39 -0
  78. package/lib/adapters/sqlite/store.js +385 -0
  79. package/lib/browser/in-page.d.ts +31 -0
  80. package/lib/browser/in-page.js +46 -0
  81. package/lib/browser/old-preview.d.ts +13 -0
  82. package/lib/browser/old-preview.js +80 -0
  83. package/lib/browser/preview-board.d.ts +8 -0
  84. package/lib/browser/preview-board.js +69 -0
  85. package/lib/cli/main.d.ts +7 -0
  86. package/lib/cli/main.js +343 -0
  87. package/lib/cli/orbit.d.ts +8 -0
  88. package/lib/cli/orbit.js +25 -0
  89. package/lib/client/http.d.ts +38 -0
  90. package/lib/client/http.js +334 -0
  91. package/lib/client/local.d.ts +26 -0
  92. package/lib/client/local.js +190 -0
  93. package/lib/client/object-url.d.ts +8 -0
  94. package/lib/client/object-url.js +21 -0
  95. package/lib/client/types.d.ts +268 -0
  96. package/lib/client/types.js +8 -0
  97. package/lib/commands/agent-tools.d.ts +31 -0
  98. package/lib/commands/agent-tools.js +100 -0
  99. package/lib/commands/index.d.ts +56 -0
  100. package/lib/commands/index.js +298 -0
  101. package/lib/commands/parse.d.ts +73 -0
  102. package/lib/commands/parse.js +231 -0
  103. package/lib/commands/present.d.ts +134 -0
  104. package/lib/commands/present.js +198 -0
  105. package/lib/commands/session.d.ts +85 -0
  106. package/lib/commands/session.js +138 -0
  107. package/lib/commands/verbs.d.ts +35 -0
  108. package/lib/commands/verbs.js +842 -0
  109. package/lib/core/actors.d.ts +18 -0
  110. package/lib/core/actors.js +45 -0
  111. package/lib/core/agent.d.ts +128 -0
  112. package/lib/core/agent.js +323 -0
  113. package/lib/core/boards.d.ts +113 -0
  114. package/lib/core/boards.js +288 -0
  115. package/lib/core/bootstrap.d.ts +47 -0
  116. package/lib/core/bootstrap.js +100 -0
  117. package/lib/core/bytes.d.ts +10 -0
  118. package/lib/core/bytes.js +52 -0
  119. package/lib/core/card-paths.d.ts +25 -0
  120. package/lib/core/card-paths.js +44 -0
  121. package/lib/core/context.d.ts +60 -0
  122. package/lib/core/context.js +42 -0
  123. package/lib/core/cross-board.d.ts +81 -0
  124. package/lib/core/cross-board.js +228 -0
  125. package/lib/core/describe.d.ts +21 -0
  126. package/lib/core/describe.js +81 -0
  127. package/lib/core/errors.d.ts +159 -0
  128. package/lib/core/errors.js +160 -0
  129. package/lib/core/files.d.ts +79 -0
  130. package/lib/core/files.js +262 -0
  131. package/lib/core/history.d.ts +20 -0
  132. package/lib/core/history.js +53 -0
  133. package/lib/core/image-types.d.ts +16 -0
  134. package/lib/core/image-types.js +36 -0
  135. package/lib/core/model.d.ts +263 -0
  136. package/lib/core/model.js +34 -0
  137. package/lib/core/nebula-link.d.ts +14 -0
  138. package/lib/core/nebula-link.js +39 -0
  139. package/lib/core/relations.d.ts +58 -0
  140. package/lib/core/relations.js +112 -0
  141. package/lib/core/search.d.ts +38 -0
  142. package/lib/core/search.js +92 -0
  143. package/lib/core/sessions.d.ts +44 -0
  144. package/lib/core/sessions.js +158 -0
  145. package/lib/core/snapshot-schema.d.ts +295 -0
  146. package/lib/core/snapshot-schema.js +82 -0
  147. package/lib/core/snapshots.d.ts +75 -0
  148. package/lib/core/snapshots.js +409 -0
  149. package/lib/core/states.d.ts +25 -0
  150. package/lib/core/states.js +126 -0
  151. package/lib/core/text.d.ts +40 -0
  152. package/lib/core/text.js +113 -0
  153. package/lib/core/tickets.d.ts +69 -0
  154. package/lib/core/tickets.js +311 -0
  155. package/lib/core/trello.d.ts +17 -0
  156. package/lib/core/trello.js +269 -0
  157. package/lib/core/verdicts.d.ts +28 -0
  158. package/lib/core/verdicts.js +92 -0
  159. package/lib/core/views.d.ts +95 -0
  160. package/lib/core/views.js +186 -0
  161. package/lib/http/app.d.ts +46 -0
  162. package/lib/http/app.js +491 -0
  163. package/lib/mcp-server.d.ts +10 -0
  164. package/lib/mcp-server.js +120 -0
  165. package/lib/node/assets.d.ts +7 -0
  166. package/lib/node/assets.js +68 -0
  167. package/lib/node/data-folder.d.ts +21 -0
  168. package/lib/node/data-folder.js +34 -0
  169. package/lib/node/env.d.ts +38 -0
  170. package/lib/node/env.js +49 -0
  171. package/lib/node/host-check.d.ts +24 -0
  172. package/lib/node/host-check.js +53 -0
  173. package/lib/node/host-services.d.ts +9 -0
  174. package/lib/node/host-services.js +150 -0
  175. package/lib/node/local.d.ts +22 -0
  176. package/lib/node/local.js +61 -0
  177. package/lib/node/migrate.d.ts +53 -0
  178. package/lib/node/migrate.js +635 -0
  179. package/lib/node/package.d.ts +7 -0
  180. package/lib/node/package.js +14 -0
  181. package/lib/node/repo-board.d.ts +49 -0
  182. package/lib/node/repo-board.js +245 -0
  183. package/lib/node/serve.d.ts +8 -0
  184. package/lib/node/serve.js +106 -0
  185. package/lib/orbit.d.ts +47 -0
  186. package/lib/orbit.js +44 -0
  187. package/lib/quiet-sqlite-warning.d.ts +1 -0
  188. package/lib/quiet-sqlite-warning.js +18 -0
  189. package/lib/store/blob-path.d.ts +6 -0
  190. package/lib/store/blob-path.js +12 -0
  191. package/lib/store/conformance.d.ts +52 -0
  192. package/lib/store/conformance.js +1449 -0
  193. package/lib/store/search-words.d.ts +10 -0
  194. package/lib/store/search-words.js +19 -0
  195. package/lib/store/types.d.ts +452 -0
  196. package/lib/store/types.js +34 -0
  197. package/llms.txt +63 -0
  198. package/package.json +109 -25
  199. package/src/cli/orbit.js +11 -658
  200. package/src/mcp-server.js +16 -876
  201. package/SKILL-ORBIT.md +0 -151
  202. package/build.mjs +0 -210
  203. package/dist/full/js/app.4e6fbe20.js +0 -952
  204. package/dist/full/js/app.4e6fbe20.js.map +0 -7
  205. package/dist/full/styles.4e60d824.css +0 -1
  206. package/docs/AGENT_PROTOCOL.md +0 -424
  207. package/docs/MCP_SETUP.md +0 -54
  208. package/docs/ORBIT_DISPATCH.md +0 -280
  209. package/docs/SS-Orbit-Dark.png +0 -0
  210. package/docs/SS-Orbit-Light.png +0 -0
  211. package/docs/mcp-client.example.json +0 -13
  212. package/docs/setup/orbit-init-wizard.md +0 -174
  213. package/public/apple-touch-icon.png +0 -0
  214. package/public/cursors/live_arrow.cur +0 -0
  215. package/public/cursors/live_link.cur +0 -0
  216. package/public/cursors/live_move.cur +0 -0
  217. package/public/cursors/live_select.cur +0 -0
  218. package/public/cursors/live_unavail.cur +0 -0
  219. package/public/favicon-32x32.png +0 -0
  220. package/public/fonts/Chakra_Petch/ChakraPetch-Bold.ttf +0 -0
  221. package/public/fonts/Chakra_Petch/ChakraPetch-BoldItalic.ttf +0 -0
  222. package/public/fonts/Chakra_Petch/ChakraPetch-Italic.ttf +0 -0
  223. package/public/fonts/Chakra_Petch/ChakraPetch-Light.ttf +0 -0
  224. package/public/fonts/Chakra_Petch/ChakraPetch-LightItalic.ttf +0 -0
  225. package/public/fonts/Chakra_Petch/ChakraPetch-Medium.ttf +0 -0
  226. package/public/fonts/Chakra_Petch/ChakraPetch-MediumItalic.ttf +0 -0
  227. package/public/fonts/Chakra_Petch/ChakraPetch-Regular.ttf +0 -0
  228. package/public/fonts/Chakra_Petch/ChakraPetch-SemiBold.ttf +0 -0
  229. package/public/fonts/Chakra_Petch/ChakraPetch-SemiBoldItalic.ttf +0 -0
  230. package/public/fonts/Chakra_Petch/OFL.txt +0 -93
  231. package/public/fonts/Inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
  232. package/public/fonts/Inter/Inter-VariableFont_opsz,wght.ttf +0 -0
  233. package/public/fonts/Inter/OFL.txt +0 -93
  234. package/public/fonts/Inter/README.txt +0 -118
  235. package/public/fonts/JetBrains_Mono/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  236. package/public/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf +0 -0
  237. package/public/fonts/JetBrains_Mono/README.txt +0 -79
  238. package/public/fonts/OpenRing-Regular.ttf +0 -0
  239. package/public/fonts/Open_Sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  240. package/public/fonts/Open_Sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  241. package/public/fonts/Open_Sans/README.txt +0 -100
  242. package/public/fonts/Orbitron/OFL.txt +0 -93
  243. package/public/fonts/Orbitron/Orbitron-VariableFont_wght.ttf +0 -0
  244. package/public/fonts/Orbitron/README.txt +0 -68
  245. package/public/fonts/Rajdhani/OFL.txt +0 -93
  246. package/public/fonts/Rajdhani/Rajdhani-Bold.ttf +0 -0
  247. package/public/fonts/Rajdhani/Rajdhani-Light.ttf +0 -0
  248. package/public/fonts/Rajdhani/Rajdhani-Medium.ttf +0 -0
  249. package/public/fonts/Rajdhani/Rajdhani-Regular.ttf +0 -0
  250. package/public/fonts/Rajdhani/Rajdhani-SemiBold.ttf +0 -0
  251. package/public/fonts/runescape-uf.ttf +0 -0
  252. package/public/index.html +0 -769
  253. package/public/js/actor-labels.js +0 -65
  254. package/public/js/api.js +0 -39
  255. package/public/js/app.js +0 -45
  256. package/public/js/artifact-drawer.js +0 -79
  257. package/public/js/board-export.js +0 -161
  258. package/public/js/board-menu.js +0 -374
  259. package/public/js/card-actions.js +0 -545
  260. package/public/js/config.js +0 -20
  261. package/public/js/create-card.js +0 -190
  262. package/public/js/dom.js +0 -19
  263. package/public/js/drawer.js +0 -273
  264. package/public/js/font-preference.js +0 -230
  265. package/public/js/format.js +0 -433
  266. package/public/js/help-menu.js +0 -31
  267. package/public/js/icons.js +0 -16
  268. package/public/js/kanban.js +0 -694
  269. package/public/js/local-backend.js +0 -1015
  270. package/public/js/main.js +0 -161
  271. package/public/js/modal.js +0 -33
  272. package/public/js/motion-preference.js +0 -64
  273. package/public/js/panel.js +0 -58
  274. package/public/js/router.js +0 -134
  275. package/public/js/search.js +0 -56
  276. package/public/js/settings-tabs.js +0 -7
  277. package/public/js/settings.js +0 -1634
  278. package/public/js/sse.js +0 -159
  279. package/public/js/starscape.js +0 -332
  280. package/public/js/state.js +0 -129
  281. package/public/js/text-editing.js +0 -128
  282. package/public/js/theme-preference.js +0 -95
  283. package/public/js/ticket-detail.js +0 -1516
  284. package/public/js/ticket-typeahead.js +0 -49
  285. package/public/js/toast.js +0 -89
  286. package/public/js/topbar-notes.js +0 -155
  287. package/public/js/transport.js +0 -22
  288. package/public/js/typeahead.js +0 -206
  289. package/public/js/unread.js +0 -121
  290. package/public/js/update-check.js +0 -58
  291. package/public/js/url-routes.js +0 -94
  292. package/public/orbits-favicon.png +0 -0
  293. package/public/orbits-logo-bg-wide.png +0 -0
  294. package/public/orbits-logo-bg.png +0 -0
  295. package/public/orbits-logo.png +0 -0
  296. package/public/styles.css +0 -7709
  297. package/src/core/agent.js +0 -387
  298. package/src/core/agents-md.js +0 -109
  299. package/src/core/artifacts.js +0 -149
  300. package/src/core/attachments.js +0 -238
  301. package/src/core/auth.js +0 -85
  302. package/src/core/backups.js +0 -142
  303. package/src/core/board.js +0 -148
  304. package/src/core/boards.js +0 -409
  305. package/src/core/bootstrap.js +0 -170
  306. package/src/core/css-bundle.js +0 -30
  307. package/src/core/db.js +0 -315
  308. package/src/core/delete-board.js +0 -163
  309. package/src/core/dispatch.js +0 -1007
  310. package/src/core/events.js +0 -314
  311. package/src/core/http.js +0 -115
  312. package/src/core/migrate.js +0 -198
  313. package/src/core/paths.js +0 -55
  314. package/src/core/provision-repo-board.js +0 -119
  315. package/src/core/queries.js +0 -246
  316. package/src/core/registry.js +0 -211
  317. package/src/core/relations.js +0 -163
  318. package/src/core/review-verdicts.js +0 -138
  319. package/src/core/router.js +0 -556
  320. package/src/core/search.js +0 -183
  321. package/src/core/seed.js +0 -234
  322. package/src/core/snapshots.js +0 -692
  323. package/src/core/states.js +0 -167
  324. package/src/core/system-picker.js +0 -109
  325. package/src/core/tickets.js +0 -400
  326. package/src/core/util.js +0 -106
  327. package/src/core/version-check.js +0 -154
  328. package/src/mcp/orbit-client.js +0 -287
  329. package/src/server.js +0 -115
package/public/index.html DELETED
@@ -1,769 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Orbit</title>
7
- <link
8
- rel="icon"
9
- type="image/png"
10
- sizes="32x32"
11
- href="./favicon-32x32.png"
12
- />
13
- <link
14
- rel="apple-touch-icon"
15
- sizes="180x180"
16
- href="./apple-touch-icon.png"
17
- />
18
- <!-- Apply the stored theme + motion + font/size preferences before first
19
- paint, so the app underneath the splash paints in the right theme
20
- (no flash) and at the right type size (no layout jump), and the
21
- splash respects an explicit reduce-motion choice. Mirrors
22
- theme-preference.js (mab_theme), motion-preference.js
23
- (mab_reduce_motion → data-motion), and font-preference.js
24
- (orbit_font_preferences → --orbit-font-* / --type-*); main.js
25
- reconciles on load. -->
26
- <script>
27
- try {
28
- var t = localStorage.getItem("mab_theme");
29
- if (t === "light" || t === "dark")
30
- document.documentElement.setAttribute("data-theme", t);
31
- var rm = localStorage.getItem("mab_reduce_motion");
32
- if (rm === "true")
33
- document.documentElement.setAttribute("data-motion", "reduce");
34
- else if (rm === "false")
35
- document.documentElement.setAttribute("data-motion", "full");
36
- var fp = JSON.parse(localStorage.getItem("orbit_font_preferences") || "{}");
37
- var stacks = {
38
- inter: '"Orbit Inter", "Inter", "Segoe UI Variable", "Segoe UI", Arial, sans-serif',
39
- openSans: '"Orbit Open Sans", "Open Sans", "Segoe UI Variable", "Segoe UI", Arial, sans-serif',
40
- jetBrainsMono: '"Orbit JetBrains Mono", "JetBrains Mono", "Cascadia Mono", "SFMono-Regular", Consolas, monospace',
41
- chakraPetch: '"Orbit Chakra Petch", "Chakra Petch", "Segoe UI Variable", "Segoe UI", Arial, sans-serif',
42
- orbitron: '"Orbit Orbitron", "Orbitron", "Segoe UI Variable", "Segoe UI", Arial, sans-serif',
43
- rajdhani: '"Orbit Rajdhani", "Rajdhani", "Segoe UI Variable", "Segoe UI", Arial, sans-serif',
44
- runescapeUF: '"Orbit Runescape UF", "Cascadia Mono", monospace',
45
- openRing: '"Orbit Open Ring", "Segoe UI Variable", "Segoe UI", Arial, sans-serif'
46
- };
47
- var defaults = {
48
- control: "inter",
49
- heading: "orbitron",
50
- label: "inter",
51
- badge: "orbitron"
52
- };
53
- var aliases = { ui: "control" };
54
- var targets = {
55
- control: "--orbit-font-control",
56
- heading: "--orbit-font-heading",
57
- label: "--orbit-font-label",
58
- badge: "--orbit-font-badge"
59
- };
60
- var dataAttrs = {
61
- control: "data-font-control",
62
- heading: "data-font-heading",
63
- label: "data-font-label",
64
- badge: "data-font-badge"
65
- };
66
- if (!fp.badge && fp.label && fp.label !== "inter" && stacks[fp.label]) {
67
- fp.badge = fp.label;
68
- }
69
- Object.keys(targets).forEach(function (target) {
70
- var id = stacks[fp[target]] ? fp[target] : defaults[target];
71
- Object.keys(aliases).forEach(function (legacy) {
72
- if (aliases[legacy] === target && !stacks[fp[target]] && stacks[fp[legacy]]) {
73
- id = fp[legacy];
74
- }
75
- });
76
- document.documentElement.style.setProperty(targets[target], stacks[id]);
77
- document.documentElement.setAttribute(dataAttrs[target], id);
78
- });
79
- var siteFont = stacks[fp.site] ? fp.site : "inter";
80
- // Body text always follows the primary font.
81
- document.documentElement.style.setProperty("--orbit-font-body", stacks[siteFont]);
82
- var userScale = Number(fp.userScale);
83
- if (!isFinite(userScale)) userScale = 1;
84
- userScale = Math.min(1.3, Math.max(0.85, userScale));
85
- document.documentElement.style.setProperty("--type-user-scale", String(userScale));
86
- document.documentElement.setAttribute("data-font-site", siteFont);
87
- } catch (e) {}
88
- </script>
89
- <link rel="preload" as="image" href="./orbits-logo.png" />
90
- <link rel="stylesheet" href="/styles.css" />
91
- <!-- Boot splash — the canonical ss-ui loading screen (see the package's
92
- components/loader.css). Inline critical CSS so it paints before
93
- /js/main.js loads. The logo grows in then breathes; no spinner.
94
- Keyframes namespaced `starscape-loader-*`. Under reduced motion the grow-in
95
- is dropped and the dot grid stops; the gentle breathe stays. -->
96
- <style>
97
- .loader {
98
- position: fixed;
99
- inset: 0;
100
- z-index: 99999;
101
- display: flex;
102
- flex-direction: column;
103
- align-items: center;
104
- justify-content: center;
105
- gap: 2rem;
106
- overflow: hidden;
107
- background: linear-gradient(
108
- 135deg,
109
- #1a1a2e 0%,
110
- #16213e 50%,
111
- #0f3460 100%
112
- );
113
- transition: opacity 0.4s ease;
114
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI",
115
- Roboto, "Helvetica Neue", Arial, sans-serif;
116
- }
117
- .loader::before {
118
- content: "";
119
- position: absolute;
120
- width: 200%;
121
- height: 200%;
122
- background-image: radial-gradient(
123
- circle,
124
- rgba(168, 192, 255, 0.15) 1px,
125
- transparent 1px
126
- );
127
- background-size: 50px 50px;
128
- will-change: transform;
129
- animation: starscape-loader-drift 20s linear infinite;
130
- }
131
- .loader.is-hiding {
132
- opacity: 0;
133
- pointer-events: none;
134
- }
135
- .loader__logo {
136
- width: 120px;
137
- height: 120px;
138
- object-fit: contain;
139
- filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.3));
140
- transform-origin: center;
141
- /* translateZ in the keyframes + backface-visibility keep the star
142
- on a stable GPU layer, so it doesn't snap ~1px as the grow
143
- starts. Keep in sync with the package components/loader.css. */
144
- backface-visibility: hidden;
145
- will-change: transform;
146
- animation:
147
- starscape-loader-grow 0.6s cubic-bezier(0.22, 1, 0.36, 1) both,
148
- starscape-loader-breathe 3s ease-in-out 0.6s infinite;
149
- }
150
- .loader__label {
151
- margin: 0;
152
- color: #fff;
153
- font-size: 1.25rem;
154
- font-weight: 600;
155
- letter-spacing: 0.5px;
156
- text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
157
- }
158
- @keyframes starscape-loader-drift {
159
- from { transform: translate(0, 0); }
160
- to { transform: translate(-50px, -50px); }
161
- }
162
- @keyframes starscape-loader-grow {
163
- from { transform: scale(0) translateZ(0); opacity: 0; }
164
- to { transform: scale(1) translateZ(0); opacity: 1; }
165
- }
166
- @keyframes starscape-loader-breathe {
167
- 0%, 100% { transform: scale(1) translateZ(0); }
168
- 50% { transform: scale(1.06) translateZ(0); }
169
- }
170
- @media (prefers-reduced-motion: reduce) {
171
- :root:not([data-motion="full"]) .loader::before {
172
- animation: none;
173
- }
174
- :root:not([data-motion="full"]) .loader__logo {
175
- animation: starscape-loader-breathe 3s ease-in-out infinite;
176
- }
177
- }
178
- [data-motion="reduce"] .loader::before {
179
- animation: none;
180
- }
181
- [data-motion="reduce"] .loader__logo {
182
- animation: starscape-loader-breathe 3s ease-in-out infinite;
183
- }
184
- </style>
185
- </head>
186
- <body>
187
- <!-- Boot splash - shown immediately, removed once the app is ready. -->
188
- <div id="loader" class="loader" role="status" aria-live="polite">
189
- <img
190
- class="loader__logo"
191
- src="./orbits-logo.png"
192
- alt="Orbit"
193
- width="120"
194
- height="120"
195
- />
196
- <p class="loader__label">Loading Orbit…</p>
197
- </div>
198
-
199
- <div class="grain">
200
- <div class="milky-way" aria-hidden="true"></div>
201
- </div>
202
- <header class="topbar">
203
- <div class="brand" aria-label="Orbit">
204
- <button
205
- id="brandFocusBtn"
206
- type="button"
207
- class="brand-focus-btn"
208
- data-variant="brand-focus"
209
- aria-label="Show board notes"
210
- aria-expanded="false"
211
- aria-controls="brandFocusPopover"
212
- >
213
- <img class="mark" src="./orbits-logo.png" alt="Orbits logo" />
214
- </button>
215
- <div
216
- id="brandFocusPopover"
217
- class="brand-focus-popover"
218
- role="dialog"
219
- aria-label="Notes For You"
220
- hidden
221
- >
222
- <div class="inline-md-field brand-focus-notes-field">
223
- <span class="inline-md-field-label font-orbitron">Notes For You</span>
224
- <div id="brandFocusNotes" class="brand-focus-notes-body"></div>
225
- </div>
226
- </div>
227
- </div>
228
- <div class="controls">
229
- <button
230
- id="brandNotesBtn"
231
- type="button"
232
- class="topbar-notes brand-notes-strip"
233
- data-variant="topbar-notes"
234
- aria-label="Show board notes"
235
- aria-expanded="false"
236
- aria-controls="brandFocusPopover"
237
- >
238
- <span id="brandNotesText" class="topbar-notes__text"></span>
239
- </button>
240
- <span class="topbar-controls-gap" aria-hidden="true"></span>
241
- <div class="topbar-search" id="topbarSearch">
242
- <input
243
- id="searchInput"
244
- placeholder="Search tickets, comments, decisions..."
245
- autocomplete="off"
246
- />
247
- <div id="searchResults" class="search-results" hidden></div>
248
- </div>
249
- <button
250
- id="newTicketBtn"
251
- type="button"
252
- class="topbar-btn topbar-ctl-shrink"
253
- data-variant="cta"
254
- aria-label="New Card"
255
- >
256
- <span class="btn-plus" aria-hidden="true"></span>
257
- <span class="topbar-btn-label">New Card</span>
258
- </button>
259
- <div class="topbar-menu">
260
- <button
261
- type="button"
262
- id="boardMenuBtn"
263
- class="topbar-chip topbar-ctl-shrink"
264
- data-variant="board-chip"
265
- aria-expanded="false"
266
- aria-haspopup="true"
267
- aria-controls="boardFlyout"
268
- >
269
- <svg
270
- class="topbar-icon"
271
- width="16"
272
- height="16"
273
- viewBox="0 0 24 24"
274
- fill="none"
275
- aria-hidden="true"
276
- >
277
- <rect
278
- x="4"
279
- y="2"
280
- width="6"
281
- height="20"
282
- rx="0.75"
283
- stroke="currentColor"
284
- stroke-width="2"
285
- />
286
- <rect
287
- x="14"
288
- y="2"
289
- width="6"
290
- height="20"
291
- rx="0.75"
292
- stroke="currentColor"
293
- stroke-width="2"
294
- />
295
- </svg>
296
- <span class="topbar-chip-label">Board</span>
297
- </button>
298
- <div
299
- id="boardFlyout"
300
- class="menu-flyout menu-flyout--align-end"
301
- hidden
302
- role="menu"
303
- ></div>
304
- </div>
305
- <button
306
- id="themeToggle"
307
- type="button"
308
- class="topbar-btn topbar-ctl-shrink"
309
- data-variant="theme"
310
- aria-label="Toggle theme"
311
- >
312
- <svg
313
- class="topbar-icon"
314
- id="themeIcon"
315
- width="16"
316
- height="16"
317
- viewBox="0 0 24 24"
318
- fill="none"
319
- stroke="currentColor"
320
- stroke-width="2"
321
- stroke-linecap="round"
322
- aria-hidden="true"
323
- >
324
- <circle cx="12" cy="12" r="5" />
325
- <path
326
- d="M12 1v2m0 18v2M4.2 4.2l1.4 1.4m12.8 12.8l1.4 1.4M1 12h2m18 0h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4"
327
- />
328
- </svg>
329
- </button>
330
- <button
331
- id="helpBtn"
332
- type="button"
333
- class="topbar-btn topbar-ctl-shrink"
334
- data-variant="translucent"
335
- aria-haspopup="dialog"
336
- aria-controls="helpDialog"
337
- >
338
- <svg
339
- class="topbar-icon"
340
- width="16"
341
- height="16"
342
- viewBox="0 0 24 24"
343
- fill="none"
344
- stroke="currentColor"
345
- stroke-width="2"
346
- stroke-linecap="round"
347
- stroke-linejoin="round"
348
- aria-hidden="true"
349
- >
350
- <circle cx="12" cy="12" r="10" />
351
- <path d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3" />
352
- <path d="M12 17h.01" />
353
- </svg>
354
- <span class="topbar-btn-label">Help</span>
355
- </button>
356
- <button
357
- id="settingsBtn"
358
- type="button"
359
- class="topbar-btn topbar-ctl-shrink"
360
- data-variant="translucent"
361
- >
362
- <svg
363
- class="topbar-icon"
364
- width="16"
365
- height="16"
366
- viewBox="0 0 24 24"
367
- fill="none"
368
- stroke="currentColor"
369
- stroke-width="2"
370
- stroke-linecap="round"
371
- stroke-linejoin="round"
372
- aria-hidden="true"
373
- >
374
- <path
375
- d="M12.22 2h-.44a2 2 0 00-2 2v.18a2 2 0 01-1 1.73l-.43.25a2 2 0 01-2 0l-.15-.08a2 2 0 00-2.73.73l-.22.38a2 2 0 00.73 2.73l.15.1a2 2 0 011 1.72v.51a2 2 0 01-1 1.74l-.15.09a2 2 0 00-.73 2.73l.22.38a2 2 0 002.73.73l.15-.08a2 2 0 012 0l.43.25a2 2 0 011 1.73V20a2 2 0 002 2h.44a2 2 0 002-2v-.18a2 2 0 011-1.73l.43-.25a2 2 0 012 0l.15.08a2 2 0 002.73-.73l.22-.39a2 2 0 00-.73-2.73l-.15-.08a2 2 0 01-1-1.74v-.5a2 2 0 011-1.74l.15-.09a2 2 0 00.73-2.73l-.22-.38a2 2 0 00-2.73-.73l-.15.08a2 2 0 01-2 0l-.43-.25a2 2 0 01-1-1.73V4a2 2 0 00-2-2z"
376
- />
377
- <circle cx="12" cy="12" r="3" />
378
- </svg>
379
- <span class="topbar-btn-label">Settings</span>
380
- <span class="topbar-update-dot" title="Update available" hidden></span>
381
- </button>
382
- </div>
383
- </header>
384
-
385
- <div
386
- id="createFlyoutBackdrop"
387
- class="create-flyout-backdrop"
388
- hidden
389
- aria-hidden="true"
390
- ></div>
391
- <div
392
- id="createFlyout"
393
- class="create-flyout"
394
- hidden
395
- aria-label="New card"
396
- >
397
- <div id="createFlyoutInner" class="create-flyout-inner"></div>
398
- </div>
399
-
400
- <main class="board-main">
401
- <div id="kanban" class="kanban" aria-live="polite"></div>
402
- </main>
403
- <footer class="frame-footer" aria-label="Application signature">
404
- <span class="frame-footer-title">Orbit</span>
405
- <span class="frame-footer-subtitle"><em>a Starscape app</em></span>
406
- </footer>
407
-
408
- <div
409
- id="drawerBackdrop"
410
- class="drawer-backdrop"
411
- hidden
412
- aria-hidden="true"
413
- ></div>
414
- <aside id="drawer" class="drawer" hidden aria-label="Panel">
415
- <header class="drawer-header">
416
- <div
417
- id="drawerTitleBlock"
418
- class="drawer-title-block"
419
- ></div>
420
- <div id="drawerTabsShell" class="drawer-tabs-shell" hidden>
421
- <nav
422
- id="drawerTabs"
423
- class="drawer-tabs"
424
- role="tablist"
425
- ></nav>
426
- </div>
427
- <button
428
- type="button"
429
- id="drawerArchiveBtn"
430
- class="drawer-archive"
431
- aria-label="Archive card"
432
- title="Archive card"
433
- hidden
434
- >
435
- <svg
436
- viewBox="0 0 24 24"
437
- width="18"
438
- height="18"
439
- fill="none"
440
- stroke="currentColor"
441
- stroke-width="2"
442
- stroke-linecap="round"
443
- stroke-linejoin="round"
444
- aria-hidden="true"
445
- >
446
- <path d="M3 6h18" />
447
- <path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
448
- <path
449
- d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"
450
- />
451
- <path d="M10 11v6" />
452
- <path d="M14 11v6" />
453
- </svg>
454
- </button>
455
- <button
456
- type="button"
457
- id="drawerCloseBtn"
458
- class="drawer-close"
459
- aria-label="Close panel"
460
- >
461
- <svg
462
- class="ui-icon ui-icon-x"
463
- viewBox="0 0 24 24"
464
- aria-hidden="true"
465
- focusable="false"
466
- >
467
- <path d="M6 6l12 12M18 6 6 18" />
468
- </svg>
469
- </button>
470
- </header>
471
- <div id="drawerInner" class="drawer-inner"></div>
472
- </aside>
473
-
474
- <div
475
- id="artifactDrawerBackdrop"
476
- class="artifact-drawer-backdrop"
477
- hidden
478
- aria-hidden="true"
479
- ></div>
480
- <aside
481
- id="artifactDrawer"
482
- class="artifact-drawer"
483
- hidden
484
- aria-label="Linked markdown artifact"
485
- >
486
- <header class="artifact-drawer-header">
487
- <div class="artifact-drawer-title-block">
488
- <h2 id="artifactDrawerTitle" class="artifact-drawer-title">Artifact</h2>
489
- <p id="artifactDrawerMeta" class="artifact-drawer-meta"></p>
490
- </div>
491
- <button
492
- type="button"
493
- id="artifactDrawerCloseBtn"
494
- class="drawer-close artifact-drawer-close"
495
- aria-label="Close artifact"
496
- >
497
- <svg
498
- class="ui-icon ui-icon-x"
499
- viewBox="0 0 24 24"
500
- aria-hidden="true"
501
- focusable="false"
502
- >
503
- <path d="M6 6l12 12M18 6 6 18" />
504
- </svg>
505
- </button>
506
- </header>
507
- <div id="artifactDrawerBody" class="artifact-drawer-body"></div>
508
- </aside>
509
-
510
- <template id="commentFormTemplate">
511
- <form class="comment-form">
512
- <textarea
513
- name="body"
514
- placeholder="Add a comment, decision, or instruction..."
515
- required
516
- ></textarea>
517
- <button type="submit">Comment</button>
518
- </form>
519
- </template>
520
-
521
- <!-- Generic modal dialog — content varies by use-case.
522
- The welcome dialog auto-shows on the preview edition via main.js.
523
- Other uses: call openModal(el) from any module that imports modal.js. -->
524
- <dialog
525
- id="welcomeDialog"
526
- class="orbit-dialog"
527
- aria-labelledby="welcomeDialogTitle"
528
- >
529
- <div class="welcome-dialog-inner">
530
- <div class="welcome-dialog-head">
531
- <img
532
- class="welcome-dialog-logo"
533
- src="./orbits-logo.png"
534
- alt=""
535
- aria-hidden="true"
536
- />
537
- <span class="welcome-dialog-edition-pill"
538
- >Preview Edition</span
539
- >
540
- </div>
541
- <div class="welcome-dialog-body">
542
- <h2 id="welcomeDialogTitle" class="welcome-dialog-title">
543
- No-AI Browser Preview
544
- </h2>
545
- <p class="welcome-dialog-lede">
546
- You're using the local, browser-only preview of
547
- <strong>Orbit</strong> — a developer-first kanban board
548
- built for teams working alongside AI agents.
549
- </p>
550
- <ul class="welcome-dialog-notices">
551
- <li>
552
- <span class="welcome-dialog-notice-label"
553
- >No AI</span
554
- >
555
- Boards are stored in your browser only. AI features,
556
- MCP server, and server-side sync require the full
557
- install.
558
- </li>
559
- <li>
560
- <span class="welcome-dialog-notice-label"
561
- >Download</span
562
- >
563
- Get the full app at
564
- <a
565
- class="welcome-dialog-link"
566
- href="https://orbit.starscape.app/install"
567
- >orbit.starscape.app/install</a
568
- >
569
- </li>
570
- <li>
571
- <span class="welcome-dialog-notice-label"
572
- >Coming soon</span
573
- >
574
- Paid cloud hosting for teams — no install required.
575
- </li>
576
- </ul>
577
- </div>
578
- <footer class="welcome-dialog-footer">
579
- <button
580
- type="button"
581
- class="welcome-dialog-cta"
582
- data-modal-initial-focus
583
- data-modal-close
584
- >
585
- Get started
586
- </button>
587
- </footer>
588
- </div>
589
- </dialog>
590
-
591
- <!-- Help & About. Reuses the .orbit-dialog shell + welcome-dialog-*
592
- styling so it inherits the modal chrome; opened from the topbar
593
- Help button and wired through modal.js (Escape/backdrop close). -->
594
- <dialog
595
- id="helpDialog"
596
- class="orbit-dialog"
597
- aria-labelledby="helpDialogTitle"
598
- >
599
- <div class="welcome-dialog-inner help-dialog-inner">
600
- <div class="welcome-dialog-head">
601
- <img
602
- class="welcome-dialog-logo"
603
- src="./orbits-logo.png"
604
- alt=""
605
- aria-hidden="true"
606
- />
607
- <span
608
- class="welcome-dialog-edition-pill"
609
- id="helpDialogVersion"
610
- >Orbit</span
611
- >
612
- <button
613
- type="button"
614
- class="help-dialog-close"
615
- aria-label="Close"
616
- data-modal-close
617
- >
618
- <svg
619
- class="ui-icon ui-icon-x"
620
- viewBox="0 0 24 24"
621
- aria-hidden="true"
622
- focusable="false"
623
- >
624
- <path d="M6 6l12 12M18 6 6 18" />
625
- </svg>
626
- </button>
627
- </div>
628
- <div class="welcome-dialog-body">
629
- <h2 id="helpDialogTitle" class="welcome-dialog-title">
630
- Starscape Orbit
631
- </h2>
632
- <p class="welcome-dialog-lede">
633
- A developer-first kanban board built for teams working
634
- alongside AI agents. Track the motion of your project —
635
- and hand work to your coding agent through the Orbit MCP
636
- tools.
637
- </p>
638
-
639
- <section
640
- class="help-dialog-section"
641
- aria-label="Getting started"
642
- >
643
- <h3 class="help-dialog-heading">Getting started</h3>
644
- <ol class="help-dialog-steps">
645
- <li class="help-dialog-step">
646
- <span class="help-dialog-step__index">01</span>
647
- <div>
648
- <h4>Create a board</h4>
649
- <p>
650
- Use the <strong>Board</strong> menu →
651
- New board. Optionally point it at a
652
- coding project folder so Orbit can drop
653
- <code>SKILL-ORBIT.md</code> and
654
- <code>AGENTS.md</code> for your agent.
655
- </p>
656
- </div>
657
- </li>
658
- <li class="help-dialog-step">
659
- <span class="help-dialog-step__index">02</span>
660
- <div>
661
- <h4>Add cards &amp; the AI Ready lane</h4>
662
- <p>
663
- Capture work with
664
- <strong>New Card</strong>. Move cards
665
- into <strong>AI Ready</strong> to stage
666
- them for an agent to claim.
667
- </p>
668
- </div>
669
- </li>
670
- <li class="help-dialog-step">
671
- <span class="help-dialog-step__index">03</span>
672
- <div>
673
- <h4>Connect your coding agent</h4>
674
- <p>
675
- Add the Orbit MCP server from
676
- <strong>Settings</strong>, then ask your
677
- agent to read <code>AGENTS.md</code> and
678
- claim the next ticket.
679
- </p>
680
- </div>
681
- </li>
682
- </ol>
683
- </section>
684
-
685
- <section
686
- class="help-dialog-section"
687
- aria-label="Links"
688
- >
689
- <h3 class="help-dialog-heading">Links</h3>
690
- <ul class="help-dialog-links">
691
- <li>
692
- <a
693
- class="welcome-dialog-link"
694
- href="https://orbit.starscape.app"
695
- target="_blank"
696
- rel="noopener"
697
- >Documentation</a
698
- >
699
- </li>
700
- <li>
701
- <a
702
- class="welcome-dialog-link"
703
- href="https://github.com/brucestarlove/ss-orbit/blob/master/docs/MCP_SETUP.md"
704
- target="_blank"
705
- rel="noopener"
706
- >MCP setup</a
707
- >
708
- </li>
709
- <li>
710
- <a
711
- class="welcome-dialog-link"
712
- href="https://orbit.starscape.app/support"
713
- target="_blank"
714
- rel="noopener"
715
- >Support / Tip</a
716
- >
717
- </li>
718
- </ul>
719
- </section>
720
- </div>
721
- <footer class="welcome-dialog-footer">
722
- <button
723
- type="button"
724
- class="welcome-dialog-cta"
725
- data-modal-close
726
- >
727
- Got it
728
- </button>
729
- </footer>
730
- </div>
731
- </dialog>
732
-
733
- <script src="/js/main.js" type="module"></script>
734
- <!-- Fade out the boot splash once the DOM is ready. The /js/main.js
735
- module runs before DOMContentLoaded, so theme/motion + wiring are
736
- already applied by the time this fires. -->
737
- <script>
738
- (function () {
739
- function hideSplash() {
740
- var splash = document.getElementById("loader");
741
- if (!splash) return;
742
- // Keep the splash up for a minimum of 786ms (measured from
743
- // navigation start) so a fast load doesn't flash it in and out.
744
- var wait = Math.max(0, 786 - performance.now());
745
- setTimeout(function () {
746
- splash.classList.add("is-hiding");
747
- splash.addEventListener(
748
- "transitionend",
749
- function () {
750
- splash.remove();
751
- },
752
- { once: true }
753
- );
754
- setTimeout(function () {
755
- splash.remove();
756
- }, 600);
757
- }, wait);
758
- }
759
- if (document.readyState === "loading") {
760
- document.addEventListener("DOMContentLoaded", hideSplash, {
761
- once: true
762
- });
763
- } else {
764
- hideSplash();
765
- }
766
- })();
767
- </script>
768
- </body>
769
- </html>