@specship/specship-win32-arm64 0.12.1 → 0.13.1

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 (242) hide show
  1. package/lib/dist/bin/specship.js +48 -12
  2. package/lib/dist/bin/specship.js.map +1 -1
  3. package/lib/dist/db/migrations.d.ts +1 -1
  4. package/lib/dist/db/migrations.d.ts.map +1 -1
  5. package/lib/dist/db/migrations.js +16 -1
  6. package/lib/dist/db/migrations.js.map +1 -1
  7. package/lib/dist/db/schema.sql +10 -0
  8. package/lib/dist/server/cli.js +10 -8
  9. package/lib/dist/server/product-version.js +44 -0
  10. package/lib/dist/server/routes/claude.js +153 -42
  11. package/lib/dist/server/routes/config.js +35 -0
  12. package/lib/dist/server/routes/graph.js +22 -1
  13. package/lib/dist/server/routes/mcp.js +510 -0
  14. package/lib/dist/server/routes/projects.js +31 -3
  15. package/lib/dist/server/routes/sse.js +1 -1
  16. package/lib/dist/server/routes/status.js +3 -0
  17. package/lib/dist/server/routes/workflow.js +29 -2
  18. package/lib/dist/server/server-config.js +38 -0
  19. package/lib/dist/server/server.js +129 -59
  20. package/lib/dist/ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  21. package/lib/dist/ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  22. package/lib/dist/ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  23. package/lib/dist/ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  24. package/lib/dist/ui/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
  25. package/lib/dist/ui/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
  26. package/lib/dist/ui/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
  27. package/lib/dist/ui/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
  28. package/lib/dist/ui/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
  29. package/lib/dist/ui/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
  30. package/lib/dist/ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  31. package/lib/dist/ui/assets/index-D8e4LiVb.js +51 -0
  32. package/lib/dist/ui/assets/index-ezwX2EfG.css +1 -0
  33. package/lib/dist/ui/favicon-16.png +0 -0
  34. package/lib/dist/ui/favicon-180.png +0 -0
  35. package/lib/dist/ui/favicon-32.png +0 -0
  36. package/lib/dist/ui/favicon.svg +20 -0
  37. package/lib/dist/ui/index.html +17 -0
  38. package/lib/dist/update/resolve-latest.d.ts +14 -0
  39. package/lib/dist/update/resolve-latest.d.ts.map +1 -0
  40. package/lib/dist/update/resolve-latest.js +29 -0
  41. package/lib/dist/update/resolve-latest.js.map +1 -0
  42. package/lib/dist/update/run-installer.d.ts +13 -0
  43. package/lib/dist/update/run-installer.d.ts.map +1 -0
  44. package/lib/dist/update/run-installer.js +43 -0
  45. package/lib/dist/update/run-installer.js.map +1 -0
  46. package/lib/dist/update/updater.d.ts +53 -0
  47. package/lib/dist/update/updater.d.ts.map +1 -0
  48. package/lib/dist/update/updater.js +164 -0
  49. package/lib/dist/update/updater.js.map +1 -0
  50. package/lib/dist/workflows/executor.d.ts.map +1 -1
  51. package/lib/dist/workflows/executor.js +4 -0
  52. package/lib/dist/workflows/executor.js.map +1 -1
  53. package/lib/dist/workflows/runners/prompt.d.ts +6 -0
  54. package/lib/dist/workflows/runners/prompt.d.ts.map +1 -1
  55. package/lib/dist/workflows/runners/prompt.js +10 -0
  56. package/lib/dist/workflows/runners/prompt.js.map +1 -1
  57. package/lib/dist/workflows/runners/types.d.ts +12 -0
  58. package/lib/dist/workflows/runners/types.d.ts.map +1 -1
  59. package/lib/node_modules/.package-lock.json +11 -20
  60. package/lib/node_modules/ajv/node_modules/fast-uri/index.js +1 -1
  61. package/lib/node_modules/ajv/node_modules/fast-uri/package.json +1 -1
  62. package/lib/node_modules/ajv/node_modules/fast-uri/test/security.test.js +28 -0
  63. package/lib/node_modules/toad-cache/README.md +10 -9
  64. package/lib/node_modules/toad-cache/dist/toad-cache.cjs +139 -139
  65. package/lib/node_modules/toad-cache/dist/toad-cache.mjs +136 -140
  66. package/lib/node_modules/toad-cache/package.json +8 -8
  67. package/lib/node_modules/toad-cache/toad-cache.d.cts +20 -14
  68. package/lib/node_modules/toad-cache/toad-cache.d.ts +18 -14
  69. package/lib/node_modules/yaml/README.md +14 -31
  70. package/lib/node_modules/yaml/browser/dist/compose/compose-collection.js +3 -3
  71. package/lib/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -1
  72. package/lib/node_modules/yaml/browser/dist/compose/compose-node.js +4 -21
  73. package/lib/node_modules/yaml/browser/dist/compose/compose-scalar.js +8 -14
  74. package/lib/node_modules/yaml/browser/dist/compose/composer.js +2 -4
  75. package/lib/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -2
  76. package/lib/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +1 -3
  77. package/lib/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +2 -8
  78. package/lib/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +4 -6
  79. package/lib/node_modules/yaml/browser/dist/compose/resolve-props.js +5 -3
  80. package/lib/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +2 -1
  81. package/lib/node_modules/yaml/browser/dist/compose/util-map-includes.js +5 -1
  82. package/lib/node_modules/yaml/browser/dist/doc/Document.js +2 -3
  83. package/lib/node_modules/yaml/browser/dist/doc/anchors.js +2 -1
  84. package/lib/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -1
  85. package/lib/node_modules/yaml/browser/dist/doc/createNode.js +2 -1
  86. package/lib/node_modules/yaml/browser/dist/errors.js +1 -1
  87. package/lib/node_modules/yaml/browser/dist/log.js +6 -1
  88. package/lib/node_modules/yaml/browser/dist/node_modules/tslib/tslib.es6.js +21 -0
  89. package/lib/node_modules/yaml/browser/dist/nodes/Alias.js +12 -27
  90. package/lib/node_modules/yaml/browser/dist/nodes/YAMLMap.js +1 -1
  91. package/lib/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +49 -8
  92. package/lib/node_modules/yaml/browser/dist/parse/lexer.js +24 -28
  93. package/lib/node_modules/yaml/browser/dist/parse/parser.js +8 -31
  94. package/lib/node_modules/yaml/browser/dist/public-api.js +0 -3
  95. package/lib/node_modules/yaml/browser/dist/schema/Schema.js +2 -1
  96. package/lib/node_modules/yaml/browser/dist/schema/json/schema.js +1 -1
  97. package/lib/node_modules/yaml/browser/dist/schema/tags.js +16 -29
  98. package/lib/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +13 -5
  99. package/lib/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +1 -1
  100. package/lib/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -2
  101. package/lib/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +1 -1
  102. package/lib/node_modules/yaml/browser/dist/stringify/stringify.js +5 -10
  103. package/lib/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +3 -13
  104. package/lib/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +2 -3
  105. package/lib/node_modules/yaml/browser/dist/stringify/stringifyPair.js +1 -1
  106. package/lib/node_modules/yaml/browser/dist/stringify/stringifyString.js +16 -24
  107. package/lib/node_modules/yaml/browser/dist/util.js +1 -1
  108. package/lib/node_modules/yaml/dist/cli.d.ts +1 -1
  109. package/lib/node_modules/yaml/dist/cli.mjs +3 -5
  110. package/lib/node_modules/yaml/dist/compose/compose-collection.d.ts +4 -4
  111. package/lib/node_modules/yaml/dist/compose/compose-collection.js +3 -3
  112. package/lib/node_modules/yaml/dist/compose/compose-doc.d.ts +6 -6
  113. package/lib/node_modules/yaml/dist/compose/compose-doc.js +0 -1
  114. package/lib/node_modules/yaml/dist/compose/compose-node.d.ts +7 -8
  115. package/lib/node_modules/yaml/dist/compose/compose-node.js +4 -21
  116. package/lib/node_modules/yaml/dist/compose/compose-scalar.d.ts +4 -4
  117. package/lib/node_modules/yaml/dist/compose/compose-scalar.js +7 -13
  118. package/lib/node_modules/yaml/dist/compose/composer.d.ts +6 -7
  119. package/lib/node_modules/yaml/dist/compose/composer.js +3 -6
  120. package/lib/node_modules/yaml/dist/compose/resolve-block-map.d.ts +5 -5
  121. package/lib/node_modules/yaml/dist/compose/resolve-block-map.js +0 -2
  122. package/lib/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +5 -5
  123. package/lib/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +5 -5
  124. package/lib/node_modules/yaml/dist/compose/resolve-block-seq.js +1 -3
  125. package/lib/node_modules/yaml/dist/compose/resolve-end.d.ts +2 -2
  126. package/lib/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -7
  127. package/lib/node_modules/yaml/dist/compose/resolve-flow-collection.js +2 -8
  128. package/lib/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +4 -4
  129. package/lib/node_modules/yaml/dist/compose/resolve-flow-scalar.js +4 -6
  130. package/lib/node_modules/yaml/dist/compose/resolve-props.d.ts +2 -2
  131. package/lib/node_modules/yaml/dist/compose/resolve-props.js +5 -3
  132. package/lib/node_modules/yaml/dist/compose/util-contains-newline.d.ts +1 -1
  133. package/lib/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +1 -1
  134. package/lib/node_modules/yaml/dist/compose/util-empty-scalar-position.js +2 -1
  135. package/lib/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +2 -2
  136. package/lib/node_modules/yaml/dist/compose/util-map-includes.d.ts +3 -3
  137. package/lib/node_modules/yaml/dist/compose/util-map-includes.js +5 -1
  138. package/lib/node_modules/yaml/dist/doc/Document.d.ts +11 -11
  139. package/lib/node_modules/yaml/dist/doc/Document.js +2 -3
  140. package/lib/node_modules/yaml/dist/doc/anchors.d.ts +2 -2
  141. package/lib/node_modules/yaml/dist/doc/anchors.js +2 -1
  142. package/lib/node_modules/yaml/dist/doc/applyReviver.js +0 -1
  143. package/lib/node_modules/yaml/dist/doc/createNode.d.ts +4 -4
  144. package/lib/node_modules/yaml/dist/doc/createNode.js +2 -1
  145. package/lib/node_modules/yaml/dist/doc/directives.d.ts +1 -1
  146. package/lib/node_modules/yaml/dist/errors.d.ts +1 -1
  147. package/lib/node_modules/yaml/dist/errors.js +1 -1
  148. package/lib/node_modules/yaml/dist/index.d.ts +18 -21
  149. package/lib/node_modules/yaml/dist/log.js +4 -4
  150. package/lib/node_modules/yaml/dist/nodes/Alias.d.ts +9 -10
  151. package/lib/node_modules/yaml/dist/nodes/Alias.js +11 -26
  152. package/lib/node_modules/yaml/dist/nodes/Collection.d.ts +4 -4
  153. package/lib/node_modules/yaml/dist/nodes/Node.d.ts +9 -16
  154. package/lib/node_modules/yaml/dist/nodes/Pair.d.ts +8 -9
  155. package/lib/node_modules/yaml/dist/nodes/Scalar.d.ts +4 -9
  156. package/lib/node_modules/yaml/dist/nodes/YAMLMap.d.ts +10 -10
  157. package/lib/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +10 -10
  158. package/lib/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +3 -3
  159. package/lib/node_modules/yaml/dist/nodes/addPairToJSMap.js +48 -7
  160. package/lib/node_modules/yaml/dist/nodes/identity.d.ts +7 -7
  161. package/lib/node_modules/yaml/dist/nodes/toJS.d.ts +2 -4
  162. package/lib/node_modules/yaml/dist/options.d.ts +10 -22
  163. package/lib/node_modules/yaml/dist/parse/cst-scalar.d.ts +4 -4
  164. package/lib/node_modules/yaml/dist/parse/cst-stringify.d.ts +1 -1
  165. package/lib/node_modules/yaml/dist/parse/cst-visit.d.ts +2 -2
  166. package/lib/node_modules/yaml/dist/parse/cst.d.ts +3 -4
  167. package/lib/node_modules/yaml/dist/parse/lexer.d.ts +1 -1
  168. package/lib/node_modules/yaml/dist/parse/lexer.js +24 -28
  169. package/lib/node_modules/yaml/dist/parse/parser.d.ts +4 -4
  170. package/lib/node_modules/yaml/dist/parse/parser.js +9 -33
  171. package/lib/node_modules/yaml/dist/public-api.d.ts +5 -6
  172. package/lib/node_modules/yaml/dist/public-api.js +0 -3
  173. package/lib/node_modules/yaml/dist/schema/Schema.d.ts +5 -4
  174. package/lib/node_modules/yaml/dist/schema/Schema.js +2 -1
  175. package/lib/node_modules/yaml/dist/schema/common/map.d.ts +1 -1
  176. package/lib/node_modules/yaml/dist/schema/common/null.d.ts +1 -1
  177. package/lib/node_modules/yaml/dist/schema/common/seq.d.ts +1 -1
  178. package/lib/node_modules/yaml/dist/schema/common/string.d.ts +1 -1
  179. package/lib/node_modules/yaml/dist/schema/core/bool.d.ts +1 -1
  180. package/lib/node_modules/yaml/dist/schema/core/float.d.ts +1 -1
  181. package/lib/node_modules/yaml/dist/schema/core/int.d.ts +1 -1
  182. package/lib/node_modules/yaml/dist/schema/core/schema.d.ts +1 -1
  183. package/lib/node_modules/yaml/dist/schema/json/schema.d.ts +1 -1
  184. package/lib/node_modules/yaml/dist/schema/json/schema.js +1 -1
  185. package/lib/node_modules/yaml/dist/schema/tags.d.ts +3 -11
  186. package/lib/node_modules/yaml/dist/schema/tags.js +13 -26
  187. package/lib/node_modules/yaml/dist/schema/types.d.ts +12 -14
  188. package/lib/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +1 -1
  189. package/lib/node_modules/yaml/dist/schema/yaml-1.1/binary.js +7 -9
  190. package/lib/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +1 -1
  191. package/lib/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +1 -1
  192. package/lib/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +1 -1
  193. package/lib/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +17 -11
  194. package/lib/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +7 -7
  195. package/lib/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -1
  196. package/lib/node_modules/yaml/dist/schema/yaml-1.1/schema.js +0 -2
  197. package/lib/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +9 -9
  198. package/lib/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +1 -1
  199. package/lib/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +1 -1
  200. package/lib/node_modules/yaml/dist/stringify/stringify.d.ts +3 -3
  201. package/lib/node_modules/yaml/dist/stringify/stringify.js +5 -10
  202. package/lib/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +2 -2
  203. package/lib/node_modules/yaml/dist/stringify/stringifyCollection.js +3 -13
  204. package/lib/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +3 -3
  205. package/lib/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +1 -1
  206. package/lib/node_modules/yaml/dist/stringify/stringifyNumber.js +2 -3
  207. package/lib/node_modules/yaml/dist/stringify/stringifyPair.d.ts +2 -2
  208. package/lib/node_modules/yaml/dist/stringify/stringifyPair.js +1 -1
  209. package/lib/node_modules/yaml/dist/stringify/stringifyString.d.ts +2 -2
  210. package/lib/node_modules/yaml/dist/stringify/stringifyString.js +15 -23
  211. package/lib/node_modules/yaml/dist/util.d.ts +12 -16
  212. package/lib/node_modules/yaml/dist/util.js +2 -2
  213. package/lib/node_modules/yaml/dist/visit.d.ts +7 -7
  214. package/lib/node_modules/yaml/package.json +14 -13
  215. package/lib/package.json +7 -7
  216. package/package.json +1 -1
  217. package/lib/dist/server/ssr/md.mjs +0 -83
  218. package/lib/dist/server/ssr/public/app.css +0 -1
  219. package/lib/dist/server/ssr/render.mjs +0 -596
  220. package/lib/dist/server/ssr/routes.js +0 -73
  221. package/lib/node_modules/jsonc-parser/CHANGELOG.md +0 -76
  222. package/lib/node_modules/jsonc-parser/LICENSE.md +0 -21
  223. package/lib/node_modules/jsonc-parser/README.md +0 -364
  224. package/lib/node_modules/jsonc-parser/SECURITY.md +0 -41
  225. package/lib/node_modules/jsonc-parser/lib/esm/impl/edit.js +0 -185
  226. package/lib/node_modules/jsonc-parser/lib/esm/impl/format.js +0 -261
  227. package/lib/node_modules/jsonc-parser/lib/esm/impl/parser.js +0 -659
  228. package/lib/node_modules/jsonc-parser/lib/esm/impl/scanner.js +0 -443
  229. package/lib/node_modules/jsonc-parser/lib/esm/impl/string-intern.js +0 -29
  230. package/lib/node_modules/jsonc-parser/lib/esm/main.d.ts +0 -351
  231. package/lib/node_modules/jsonc-parser/lib/esm/main.js +0 -178
  232. package/lib/node_modules/jsonc-parser/lib/umd/impl/edit.js +0 -201
  233. package/lib/node_modules/jsonc-parser/lib/umd/impl/format.js +0 -275
  234. package/lib/node_modules/jsonc-parser/lib/umd/impl/parser.js +0 -682
  235. package/lib/node_modules/jsonc-parser/lib/umd/impl/scanner.js +0 -456
  236. package/lib/node_modules/jsonc-parser/lib/umd/impl/string-intern.js +0 -42
  237. package/lib/node_modules/jsonc-parser/lib/umd/main.d.ts +0 -351
  238. package/lib/node_modules/jsonc-parser/lib/umd/main.js +0 -194
  239. package/lib/node_modules/jsonc-parser/package.json +0 -37
  240. package/lib/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -67
  241. package/lib/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +0 -9
  242. package/lib/node_modules/yaml/dist/schema/yaml-1.1/merge.js +0 -71
@@ -65,6 +65,9 @@ const worktree_1 = require("../sync/worktree");
65
65
  const shimmer_progress_1 = require("../ui/shimmer-progress");
66
66
  const glyphs_1 = require("../ui/glyphs");
67
67
  const node_version_check_1 = require("./node-version-check");
68
+ const updater_1 = require("../update/updater");
69
+ const resolve_latest_1 = require("../update/resolve-latest");
70
+ const run_installer_1 = require("../update/run-installer");
68
71
  const wasm_runtime_flags_1 = require("../extraction/wasm-runtime-flags");
69
72
  // Lazy-load heavy modules (SpecShip, runInstaller) to keep CLI startup fast.
70
73
  async function loadSpecShip() {
@@ -89,13 +92,13 @@ async function loadServerPackage() {
89
92
  // 2. npm dep `@specship/specship-server` if some downstream
90
93
  // consumer ever wires it as a separate package (kept for forward
91
94
  // compatibility — not the shipped path).
92
- // 3. Dev/workspace sibling: `packages/server/dist/index.js` for
95
+ // 3. Dev/workspace sibling: `server/dist/index.js` for
93
96
  // running from a checkout without a prior `npm run build`.
94
97
  const candidates = [
95
98
  path.resolve(__dirname, '..', 'server', 'index.js'),
96
99
  '@specship/specship-server',
97
- path.resolve(__dirname, '..', '..', 'packages', 'server', 'dist', 'index.js'),
98
- path.resolve(__dirname, '..', '..', '..', 'packages', 'server', 'dist', 'index.js'),
100
+ path.resolve(__dirname, '..', '..', 'server', 'dist', 'index.js'),
101
+ path.resolve(__dirname, '..', '..', '..', 'server', 'dist', 'index.js'),
99
102
  ];
100
103
  let lastErr = null;
101
104
  for (const c of candidates) {
@@ -121,7 +124,7 @@ async function loadServerPackage() {
121
124
  * hyphens/dots/underscores. Recover real paths from `~/.claude.json` (its
122
125
  * `projects` object is keyed by real absolute paths), then from a `"cwd"`
123
126
  * value in the slug's newest transcript, before falling back to the lossy
124
- * decode. Mirrors `packages/server/src/ingest/project-paths.ts`
127
+ * decode. Mirrors `server/src/ingest/project-paths.ts`
125
128
  * (REQ-SLUGRES-004) — the server package depends on this one, so the CLI
126
129
  * can't import it.
127
130
  */
@@ -1588,7 +1591,7 @@ function main() {
1588
1591
  .option('--port <n>', 'HTTP port when --ui is set (default 4242)')
1589
1592
  .option('--host <h>', 'HTTP bind host when --ui is set (default 127.0.0.1)')
1590
1593
  .option('--ingest', 'Enable Claude Code JSONL transcript watcher (only when --ui is set)')
1591
- .option('--web-dir <path>', 'Path to a built Angular UI (index.html lives here); auto-detected by default')
1594
+ .option('--web-dir <path>', 'Path to a built desktop SPA (index.html lives here); auto-detected by default from the bundled ui/dist')
1592
1595
  .option('--no-web', 'Run --ui headless (API only, no SPA)')
1593
1596
  .option('--no-watch', 'Disable the file watcher (no auto-sync; useful on slow filesystems like WSL2 /mnt drives)')
1594
1597
  .action(async (options) => {
@@ -1631,12 +1634,17 @@ function main() {
1631
1634
  // Lazy-load the server package via dist path. The npm bin is
1632
1635
  // packaged with the server already built under
1633
1636
  // node_modules/@specship/specship-server, OR (dev) the
1634
- // sibling packages/server/dist directory.
1637
+ // sibling server/dist directory.
1635
1638
  const { createServer } = await loadServerPackage();
1636
- // The dashboard is the lean server-rendered UI (DASH-LEAN-DOC), served
1637
- // in-process by the server itself — no separate SPA build. `--no-web`
1638
- // still opts out to run API-only.
1639
+ // The dashboard is the built desktop SPA, served in-process by the
1640
+ // server itself (REQ-DESKTOP-033 — the server-rendered dashboard
1641
+ // retired). `--no-web` opts out to run API-only.
1639
1642
  const serveUi = options.web !== false;
1643
+ // Resolve the SPA static dir:
1644
+ // - headless (--no-web): no SPA.
1645
+ // - otherwise the built SPA — explicit --web-dir, else auto-detect
1646
+ // the bundled ui/dist (webDir === undefined triggers the probe).
1647
+ const webDir = !serveUi ? null : (options.webDir ?? undefined);
1640
1648
  // The JSONL ingest watcher now starts in-process inside createServer
1641
1649
  // when `ingest: true`. The server owns its lifecycle; CLI just toggles.
1642
1650
  const handle = await createServer({
@@ -1644,8 +1652,7 @@ function main() {
1644
1652
  host,
1645
1653
  port,
1646
1654
  ingest: options.ingest !== false,
1647
- webDir: null,
1648
- ssr: serveUi,
1655
+ webDir,
1649
1656
  verbose: false,
1650
1657
  });
1651
1658
  console.error(chalk.bold('\nSpecShip Desktop server\n'));
@@ -1658,7 +1665,7 @@ function main() {
1658
1665
  console.error(chalk.dim(' analytics endpoints will return 409 until one is selected'));
1659
1666
  }
1660
1667
  if (serveUi) {
1661
- console.error(chalk.green((0, glyphs_1.getGlyphs)().ok) + ` Dashboard: ${handle.url}/ (server-rendered)`);
1668
+ console.error(chalk.green((0, glyphs_1.getGlyphs)().ok) + ` Dashboard: ${handle.url}/`);
1662
1669
  }
1663
1670
  if (options.ingest !== false) {
1664
1671
  console.error(chalk.dim(' Claude Code transcript ingest watcher active'));
@@ -2892,6 +2899,35 @@ function main() {
2892
2899
  cg.close();
2893
2900
  }
2894
2901
  });
2902
+ /**
2903
+ * specship update — self-update to the latest release (CLI-UPDATE-DOC).
2904
+ */
2905
+ program
2906
+ .command('update')
2907
+ .description('Update SpecShip to the latest released version')
2908
+ .option('--check', 'Report whether an update is available without installing anything')
2909
+ .action(async (options) => {
2910
+ const installDir = process.env.SPECSHIP_INSTALL_DIR || path.join(os.homedir(), '.specship');
2911
+ const binDir = process.env.SPECSHIP_BIN_DIR || path.join(os.homedir(), '.local', 'bin');
2912
+ const result = await (0, updater_1.runUpdate)({
2913
+ currentVersion: packageJson.version,
2914
+ // __dirname is the resolved location of the running specship.js —
2915
+ // under ~/.specship for a bundle install, under node_modules for npm.
2916
+ detect: () => (0, updater_1.detectInstallMethod)(__dirname, installDir),
2917
+ resolveLatest: (method) => (0, resolve_latest_1.resolveLatestVersion)(method),
2918
+ runInstaller: (method) => (0, run_installer_1.runInstaller)(method, { installDir, binDir }),
2919
+ installDir,
2920
+ binDir,
2921
+ }, { check: options.check });
2922
+ for (const line of result.lines) {
2923
+ if (result.exitCode === 0)
2924
+ info(line);
2925
+ else
2926
+ warn(line);
2927
+ }
2928
+ if (result.exitCode !== 0)
2929
+ process.exit(result.exitCode);
2930
+ });
2895
2931
  // Parse and run
2896
2932
  program.parse();
2897
2933
  } // end main()